我正在执行一系列的dispatch_async,我只想在它们全部完成后更新UI。问题是dispatch_async 中的方法在单独的线程中调用某些内容,因此它会在数据完全加载之前返回,并且在加载所有内容之前调用dispatch_group_notify。
所以我引入了一个无限循环来让它等待,直到设置一个标志。
这是最好的方法吗?请参阅下面的代码。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();
for (...) {
dispatch_group_async(group, queue, ^{
__block BOOL dataLoaded = NO;
[thirdPartyCodeCallWithCompletion:^{
dataLoaded = YES;
}];
// prevent infinite loop
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)),
queue, ^{
dataLoaded = YES;
});
// infinite loop to wait until data is loaded
while (1) {
if (dataLoaded) break;
}
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//update UI
});
}
您已经了解调度组。为什么不直接使用dispatch_group_wait()
,其中包括对超时的支持?您可以使用dispatch_group_enter()
and dispatch_group_leave()
而不是dispatch_group_async()
直到第三方调用完成的内部块完成后,该组才完成。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();
for (...) {
dispatch_group_enter(group);
dispatch_async(queue, ^{
[thirdPartyCodeCallWithCompletion:^{
dispatch_group_leave(group);
}];
}
}
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, NSECS_PER_SEC));
dispatch_async(dispatch_get_main_queue(), ^{
//update UI
});
指某东西的用途dispatch_group_wait()
确实使此代码同步,如果在主线程上运行,这会很糟糕。根据超时后到底应该发生什么,您可以使用dispatch_group_notify()
像你一样并使用dispatch_after()
只是更新 UI,而不是试图假装该块已完成。
更新:我调整了我的代码以确保“更新 UI”发生在主队列上,以防万一该代码尚未在主线程上。
顺便说一句,我只用过dispatch_async()
对于调用的块thirdPartyCodeCallWithCompletion:
因为你原来用过dispatch_group_async()
我不确定假设的方法是异步的。不过,大多数采用完成块的 API 都是异步的。如果是的话,那么您可以直接调用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)