gpt4 book ai didi

objective-c - 如何防止 dispatch_group 卡住?

转载 作者:太空狗 更新时间:2023-10-30 03:31:37 25 4
gpt4 key购买 nike

如何防止 dispatch_group 卡住?我发现如果我尝试加载的图像之一未加载(例如,由于 url 错误),可能会卡在以下代码中(有或没有 dispatch_group_wait 调用)。 dispatch_group_notify 中的 block 永远不会被调用。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();

for (...) {
if (...) {
dispatch_group_enter(group);
dispatch_async(queue, ^{

[self loadImageWithUrl:url onCompletion:^{
dispatch_group_leave(group);
}];
});
}
}

dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)));
dispatch_group_notify(group, queue, ^{
NSLog(@"load image complete");
});

最佳答案

dispatch_group_notify 在组完成时将其 block 排队。你的小组永远不会完成。所以不要使用dispatch_group_notify。只需使用 dispatch_group_wait 等待超时,然后分派(dispatch)您的 block :

    ...    
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)));
dispatch_async(queue, ^{
NSLog(@"load image complete");
});

如果你想模仿一个带有超时的 dispatch_group_notify,只需在它自己的异步 block 中执行上面的操作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)));
dispatch_sync(queue, ^{
NSLog(@"load image complete");
});
});

请注意,如果这对您有用,您可以使用 dispatch_group_wait 的返回值来确定是否一切都已完成或是否超时。

请记住,之前的 block 不会被取消,因此它们最终可能会运行它们的完成 block 。如果这是一个问题,您可能需要向系统添加取消逻辑。

关于objective-c - 如何防止 dispatch_group 卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23660091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com