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

Swift 调度队列-嵌套、优化和;控制,swift,grand-central-dispatch,Swift,Grand Central Dispatch,你能就批准的方法给我一些建议吗 我有四个进程需要按顺序运行: calculateProcess1() calculateProcess2() calculateProcess3() calculateProcess4() 它们使用调度队列计算数据并更新进度条(循环)和其他屏幕文字,以进行UI更新 按原样运行它们,你会发现它们同时开火(真是令人惊讶!) 如何使顶级调用按顺序运行(如上所述),以及在更新文本的过程中是否需要更改DispatchQueues,例如: DispatchQueue.mai

你能就批准的方法给我一些建议吗

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

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-

这应该是ViewDidLoad、按钮操作还是最安全的方法

这取决于您这里没有与安全相关的东西,将其作为您的UX实现


3-要在dequence中运行它们,请创建一个自定义队列,然后在其中分派它们,因为如果所有这些方法中的代码都在队列的同一线程中运行,则它将以串行方式运行,这意味着您不会在另一个队列中内部分派,您还可以使用
DispatchGroup
在所有操作完成后收到通知

一种方法是使用和。将
OperationQueue
上的
maxConcurrentOperationCount:Int
设置为
1
,将强制按顺序依次执行操作

(以前称为
NSOperation
NSOperationQueue

这篇博文会很有帮助:


当然还有非常棒的WWDC15会话:

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

calculateProcess1() {
    calculateProcess2() {
        calculateProcess3() {
            calculateProcess4() {}
        }
    }
}
这应该是ViewDidLoad、按钮操作还是最重要的 安全方法


viewDidLoad
可能就是您想要的。请记住,如果实例化同一类型的新viewController并显示它,则该新控制器也会再次出现。此外,如果您正在使用图幅进行任何操作,则不能保证这些图幅在
viewdiload
中列出,但如果您只是在更新文本,则应该可以

感谢大家的指导-我将阅读并实现。在使用嵌套时获取“传递给不带参数的调用的参数”:calculateProcess1(){calculateProcess2(){calculateProcess3(){calculateProcess4(){}}}},而:calculateProcess1()calculateProcess2()calculateProcess3()calculateProcess4()编译。@EdwardHasted您必须将回调块作为参数添加到方法中。这很好,但很难理解——让我仔细阅读这些笔记——非常感谢。