dispatch_group_async whitin dispatch_group_notify

时间:2013-06-05 10:29:20

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

我想在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
    // ...
    });
});

现在一切正常。

您是否发现此调度内部调度结构存在任何问题?还是没事?

谢谢!

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之后执行,但所有这些都不在主线程中