ProgressManager

ProgressManager 是一个类,旨在使处理 Progress 及其子任务变得更直接和容易。 为什么要使用它? 它允许对多步操作的细节进行细粒度但易于访问的控制,同时自动将其状态反映在诸如 ProgressViewUIProgressViewNSProgressIndicator 等视图中。

如何使用 ProgressManager

  1. 创建一个您想要用于引用每个子任务的类型(最简单的是枚举,但可以是任何符合 ChildProgressTask 的东西)。 它必须具有两个属性:childUnitsparentUnits。 有关更多信息,请参阅文档。
private enum ProgressSteps: ChildProgressTask {
    case importantStep, smallStep, aMultiUnitStep
    
    var childUnits: Int64 {
        switch self {
        // 1 unit of this task must be completed for it to be considered "complete" by the parent
        case .importantStep: 1
        // 1 unit of this task must be completed for it to be considered "complete" by the parent
        case .smallStep: 1
        // 6 units of this task must be completed for it to be considered "complete" by the parent
        case .aMultiUnitStep: 6
        }
    }
    
    var parentUnits: Int64 {
        switch self {
        // Once all units of this child task have been completed (1 unit),
        // it counts as 5 units in the context of the parent progress
        case .importantStep: 5
        // Once all units of this child task have been completed (1 unit),
        // it counts as 1 unit in the context of the parent progress
        case .smallStep: 1
        // Once all units of this child task have been completed (6 units),
        // it counts as 1 unit in the context of the parent progress
        case .aMultiUnitStep: 1
        }
    }
}
  1. 然后,使用您的类型创建一个 ProgressManager 的实例。 初始化 ProgressManager 时,您只需要向其提供一个它关心的任务的 Set。 如果您的类型符合 CaseIterable,您甚至可以排除初始值设定项的 childTasks 参数。
let progress = ProgressManager(
    // can be ommitted if type can be inferred
    ProgressSteps.self,
    // a Set of unique child tasks
    childTasks: [.importantStemp, .smallStep, .aMultiUnitStep]
)
  1. 当您的代码完成任务时,您可以调用子任务更新函数的任意组合(setCompletedUnitCount(_:forChildTask:)addToCompletedUnitCount(_:forChildTask:)updateCompletedUnitCount(forChildTask:updateClosure:))。
// Perform `.importantStep`.
progress.setCompletedUnitCount(1, forChildTask: .importantStep)

// Perform `.smallStemp`.
progress.setCompletedUnitCount(1, forChildTask: .smallStemp)

// Perform `.aMultiUnitStep`.
for i in 0..<6 {
    progress.addToCompletedUnitCount(i, forChildTask: .aMultiUnitStep)
}

就是这样! 如果您需要更细粒度的控制,您可以通过 childTasks 属性或者直接通过下标(progress[.aMultiUnitStep])访问子任务。