我有两个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
。
但是,确保B2
在B1
开始执行之前完全执行了吗?由于B2
使用B1
更新的文件。
如果在B2
完成之前B2
开始执行,可能会导致一些问题。
或者做得更好
B1
答案 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
子类等中。)。