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

时间:2019-04-25 13:30:46

标签: swift grand-central-dispatch

请问您对批准的方法有何建议?

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

$baseStr = 'www.abc.com/cdf/?x=10';
$searchStr = 'www.abc.com/';
$insertStr = 'xxx/';

$a = str_replace($searchStr, $searchStr.$insertStr, $baseStr);
echo '<pre>';
print_r($a);

//Output: www.abc.com/xxx/cdf/?x=10

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

按原样运行它们,瞧瞧它们都同时发射了(真是令人惊讶!)。

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

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

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

3 个答案:

答案 0 :(得分:2)

1-请勿在主线程中sync,因为它会导致运行时崩溃,应为async

DispatchQueue.main.sync { 

2-

  

这应该在ViewDidLoad中,按钮操作中还是最安全的方法是什么?

这取决于您,这里没有与安全相关的东西,可以将其实现为您的用户体验

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

答案 1 :(得分:2)

一种方法是使用OperationOperationQueue。在maxConcurrentOperationCount: Int上将1设置为OperationQueue,将强制依次执行操作。

(以前称为NSOperationNSOperationQueue

此博客文章可能会有所帮助:https://nshipster.com/nsoperation/

当然还有很棒的WWDC15会议:Advanced NSOperations

答案 2 :(得分:2)

如果要保持简单,可以为calculateProcess方法提供回调块,然后将它们嵌套即可。

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

这应该在ViewDidLoad中,还是一个按钮动作或最多   安全的方法?

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