调度队列 - 嵌套、优化和控制

Dispatch Queues - Nesting, Optimisation & Control

我可以就批准的方法提出建议吗?

我有四个进程需要按顺序运行:

calculateProcess1()
calculateProcess2()
calculateProcess3()
calculateProcess4()

这些计算数据并使用调度队列更新进度条(圆形)和其他屏幕文字以进行 UI 更新。

运行 它们保持原样,你瞧,它们同时发射(真是令人惊讶!)。

如何按顺序进行顶级调用 运行(如上所述),我是否需要在更新文字的过程中更改我的 DispatchQueues,例如:

DispatchQueue.main.sync { 
     let progressPercentage = (day*100/365)
     self.progressLabel.text = String(Int(progressPercentage))+"%"  
}

启动进程 (calculateProcess1-4()) 需要从 main 运行。这应该在 ViewDidLoad 中,按钮操作还是最安全的方法?

1- 不要在主线程中 sync 因为它会导致 运行 时间崩溃,它应该是 async

DispatchQueue.main.sync { 

2-

Should this be in ViewDidLoad, a button action or what is the most secure method?

由您决定这里没有与安全相关的内容,将其作为您的 UX 实施

3- 到 运行 它们依次创建一个自定义队列,然后将它们分派到其中,因为如果所有这些方法中的代码 运行 在同一个中,它将 运行 串行队列的线程意味着你不会在另一个队列内部调度,你也可以使用 DispatchGroup 在所有完成时得到通知

一种方法是使用 Operation and OperationQueue。在 OperationQueue 上将 maxConcurrentOperationCount: Int 设置为 1 将强制操作按顺序执行,一个接一个。

(以前称为 NSOperationNSOperationQueue

这篇博文可能会有帮助:https://nshipster.com/nsoperation/

当然还有很棒的 WWDC15 session:Advanced NSOperations

如果您想保持简单,您可以为 calculateProcess 方法提供回调块并简单地嵌套它们。

calculateProcess1() {
    calculateProcess2() {
        calculateProcess3() {
            calculateProcess4() {}
        }
    }
}

Should this be in ViewDidLoad, a button action or what is the most secure method?

viewDidLoad 可能就是您想要的。请记住,如果您实例化一个相同类型的新 viewController 并显示它,它也会针对该新控制器再次发生一次。此外,如果您正在对视图框架进行任何操作,则不能保证将它们布置在 viewDidLoad 中,但如果您只是更新文本,那么应该没问题。