gpt4 book ai didi

objective-c - 除非与 NSRunLoop 一起使用,否则 dispatch_group_wait 不会按预期运行?

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:28 25 4
gpt4 key购买 nike

我试图弄清楚 NSRunLoop 有什么特殊属性会导致以下行为。

首先,我要做的是等待 CLGeocoder 完成执行后再继续。如果我使用完成 block ,代码将如下所示:

if (/* loc has valid coordinates */)
[gc reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError error){
//do things
[gc reverseGeocodeLocation:newloc completionHandler:^(NSArray *placemarks, NSError error){
//do more things with newloc
// MOVE TO NEXT VIEW
}
}
else if (/*still have to check for newloc*/)
[gc reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError error){
//do things
//MOVE TO NEXT VIEW

不幸的是,这些 block 的 //do things 部分很冗长,如果我将 CLGeocoder 嵌套在它自己的函数中,并在我调用它后移动到下一个 View ,它会更清晰两次。

感谢这里的答案,我找到了一种强制等待的方法:Waiting for CLGeocoder to finish on concurrent enumeration

所以新方法有效,但我不知道为什么有效。这是代码:

dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);

[gc reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError *error){
//do things
dispatch_group_leave(group);
}

//this is the confusing part!
while(dispatch_group_wait(group,DISPATCH_TIME_NOW)){
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0f]];
}
dispatch_release(group);

奇怪的是,如果我在没有 while 循环的情况下执行以下操作,应用程序会挂起:

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);

鉴于我目前阅读的所有内容,这应该行得通,对吧?


更令人困惑的是,NSRunLoop 是 while 循环中的必需品。如果我完全删除它,留下一个空的 while 循环,循环将无休止地重复。像这样:

//this is the confusing part!
while(dispatch_group_wait(group,DISPATCH_TIME_NOW)){
//without NSRunLoop, this just goes on forever
}

NSRunLoop 做了什么让 while 循环成功结束?

最佳答案

CLGeocoder 文档说它在主线程上运行完成处理程序 block 。我推断您正在主线程上运行 wait-forever 或 while(dispatch_group_wait(...)) 循环。如果您正在阻塞主线程,则主线程无法运行完成 block 。

通过在 while 循环中调用 runMode:beforeDate:,您可以让运行循环有机会运行完成 block 。

你的所作所为很糟糕。你不应该阻塞主线程,你应该尽量避免递归地运行一个运行循环(因为,正如你所发现的,它很困惑)。 CLGeocoder 允许您提供完成 block 的原因是您可以将其设置为运行然后返回到主运行循环。稍后,当 CLGeocoder 运行您的完成 block 时,您可以以任何需要的方式使用结果。

关于objective-c - 除非与 NSRunLoop 一起使用,否则 dispatch_group_wait 不会按预期运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12832348/

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