dispatch_async了解执行顺序

时间:2017-02-22 18:31:19

标签: objective-c grand-central-dispatch dispatch-async

我有两个API调用如下:

-(void) doTask1{ 

    dispatch_async(queueSerial, ^{ //B1

     [fileObj setFileInfo:file]; 

    });
}

-(void) doTask2{ 

    dispatch_async(queueSerial, ^{ //B2

        [fileObj getFileInfo:fileName completion:^(NSError *error) {
            dispatch_async(queueSerial2, ^{
                //completion work C1
            });
         }]

    });
}

现在,我的问题是,通过阅读GCD已经理解,如果进程调用doTask1并且在调用doTask2之后立即执行,则会导致它们都排队并{{{ 1}}提前B1

但是,确保B2B1开始执行之前完全执行了吗?由于B2使用B1更新的文件。

如果在B2完成之前B2开始执行,可能会导致一些问题。

或者做得更好

B1

3 个答案:

答案 0 :(得分:1)

如果queueSerial确实是一个串行队列,那么B1将在B2开始之前完成。无法保证这些与doTaskN方法之间的关系......会受到_sync修改的影响。

如果B1或B2自己进行任何调度,那么它也不受序列化控制。

答案 1 :(得分:0)

如果您使用串行队列,您的任务将以相同的顺序完成(先进先出),但如果您使用并发,您将无法保证他们完成的订单。

react-native

以下是GCD和NSOperation对并发的一个很好的解释:https://www.appcoda.com/ios-concurrency/

您需要确保两个任务都发送到同一个队列。

更新: 另一种方法是使用NSOperation,因为您可以在任务之间设置依赖关系,以确保在启动另一个任务之前完成任务。

答案 2 :(得分:0)

如果发送到串行队列的任务B1没有启动任何异步,那么你确定B1将在B2启动之前完成。但是如果B1正在做任何异步(例如,网络请求等),那么你需要其他模式来确保B2在异步任务完成之前不会启动(例如实现自己的完成处理程序) ,使用dispatch_group_notify,将任务包装在异步自定义NSOperation子类等中。)。