调度队列 - 嵌套、优化和控制
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
将强制操作按顺序执行,一个接一个。
(以前称为 NSOperation
和 NSOperationQueue
)
这篇博文可能会有帮助: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
中,但如果您只是更新文本,那么应该没问题。
我可以就批准的方法提出建议吗?
我有四个进程需要按顺序运行:
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
将强制操作按顺序执行,一个接一个。
(以前称为 NSOperation
和 NSOperationQueue
)
这篇博文可能会有帮助: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
中,但如果您只是更新文本,那么应该没问题。