我应该如何等待GCD中并行异步任务的完成?

时间:2015-04-07 20:51:50

标签: objective-c grand-central-dispatch

dispatch_groupdispatch_group_notify()是一种合理的方式来等待在目标C中使用GCD完成并行异步任务吗?

请考虑以下事项:

dispatch_group_t requestGroup = dispatch_group_create();
dispatch_group_enter(requestGroup);
dispatch_group_enter(requestGroup);
[asyncCall1 completion:^{
    dispatch_group_leave(requestGroup);
}];

[asyncCall2 completion:^{
    dispatch_group_leave(requestGroup);
}];

dispatch_group_notify(requestGroup, dispatch_get_main_queue(), ^{
    // do something now that both async calls have completed
});

这是最简单,最好的方法吗?我问的原因是我有这样的代码,通常它似乎工作,虽然我很少崩溃像:

libdispatch.dylib`dispatch_group_leave:
0x394ea4e8:  dmb    ishst
0x394ea4ec:  ldrex  r1, [r0, #0x28]
0x394ea4f0:  adds   r1, #0x1
0x394ea4f2:  strex  r2, r1, [r0, #0x28]
0x394ea4f6:  cmp    r2, #0x0
0x394ea4f8:  bne    0x394ea4ec                ; dispatch_group_leave + 4
0x394ea4fa:  cmp.w  r1, #0xffffffff
0x394ea4fe:  ble    0x394ea50e                ; dispatch_group_leave + 38
0x394ea500:  mvn    r2, #0x80000000
0x394ea504:  cmp    r1, r2
0x394ea506:  it     eq
0x394ea508:  beq.w  0x394edd54                ; _dispatch_group_wake
0x394ea50c:  bx     lr
0x394ea50e:  trap   
0x394ea510:  mov    r8, r8
0x394ea512:  mov    r8, r8

这是一个被调度组捕获的未连接崩溃吗?

2 个答案:

答案 0 :(得分:1)

如果您想要同步等待,可以使用dispatch_group_asyncdispatch_group_wait

更多细节(和示例):Waiting on groups of queued tasks

而且,虽然我没有使用它,但我相信你也可以将dispatch_group_notifydispatch_group_async一起使用,这可能比进入和离开更清洁一些?

答案 1 :(得分:1)

@Rob是正确的,并且有一个特定情况,可以调用两次完成块,这意味着对dispatch_group_leave()dispatch_group_enter()的调用是不平衡的,这是不受支持的。

相关问题