dispatch_group
和dispatch_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
这是一个被调度组捕获的未连接崩溃吗?
答案 0 :(得分:1)
如果您想要同步等待,可以使用dispatch_group_async
和dispatch_group_wait
。
更多细节(和示例):Waiting on groups of queued tasks
而且,虽然我没有使用它,但我相信你也可以将dispatch_group_notify
与dispatch_group_async
一起使用,这可能比进入和离开更清洁一些?
答案 1 :(得分:1)
@Rob是正确的,并且有一个特定情况,可以调用两次完成块,这意味着对dispatch_group_leave()
和dispatch_group_enter()
的调用是不平衡的,这是不受支持的。