我想在iOS应用程序中执行一些顺序作业。我想确保在上一个作业完成之前不执行作业。首先尝试做这样的事情
group = dispatch_group_create();
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue, ^{
// Job 1
// ...
});
dispatch_group_async(group, queue, ^{
// Job 2
// ...
});
这样,有时作业2在作业1仍在执行时开始执行。
然后我用这种方式:
group = dispatch_group_create();
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_notify(group, queue, ^{
// Job 1
// ...
});
dispatch_group_notify(group, queue, ^{
// Job 2
// ...
});
行为是相同的,因为作业1没有被异步调度,因此dispatch_group_notify()
函数认为没有执行任何操作,并且调度作业2而不等待作业1。
我找到了另一个解决方案:
group = dispatch_group_create();
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_notify(group, queue, ^{
dispatch_group_async(group, queue, ^{
// Job 1
// ...
});
});
dispatch_group_notify(group, queue, ^{
dispatch_group_async(group, queue, ^{
// Job 2
// ...
});
});
现在一切正常。
您是否发现此调度内部调度结构存在任何问题?还是没事?
谢谢!
答案 0 :(得分:2)
您使用
获得的全局队列queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
是并发队列。如果您希望您的作业按顺序执行,只需创建即可 带有
的串行队列queue = dispatch_queue_create("com.company.myqueue", NULL);
答案 1 :(得分:2)
它比你做的更容易,只需使用串行队列:
dispatch_queue_t myQueue ;
myQueue = dispatch_queue_create("cua.prova", nil);
dispatch_async(myQueue, ^{
NSLog(@"Job 1");
});
dispatch_async(myQueue, ^{
NSLog(@"Job 2");
});
dispatch_async(myQueue, ^{
NSLog(@"Job 3");
});
作业1始终在作业2之前执行,作业3在作业2之后执行,但所有这些都不在主线程中