我是iOS编程新手并且有一个基本问题。到目前为止,我通过打开locationManager对象中的位置更新来获取iPhone的位置。之后,我的代码结束,并在调用委托方法didUpdateLocations时获取位置。
但现在我想获得一个位置更新,并在代码序列中执行此操作:
第1行:无论
第2行:无论
第3行:无论
第4行:[locationManager requestLocation]
第5行:等待位置更新
第6行:使用新的位置信息
第7行:无论
等
但是我意识到,当上面的线程处于"等待位置更新时,不会调用didUpdateLocations"。
处理此类情况的正确方法是什么?
我是否需要以某种方式请求位置更新发生在另一个线程上,以便上面的线程可以保持并行运行?
谢谢,
-Steve
新修改:
假设我在didUpdateLocations中执行此操作:在全局变量上设置一个标志以指示该位置已更新(即locationUpdated = 1)并设置location = updated_location。
然后在第5行(在上面的示例中)我等待locationUpdated == 1.然后在第6行我可以使用"位置"变量
以这种方式编写代码是否有意义?
在我的实验中,如果我在循环轮询中等待locationUpdated == 1,它将阻止调用didUpdateLocations。那么这可能是GrandCentralDispatch将一个等待循环放在另一个线程中的工作呢?我从来没有用过它。
答案 0 :(得分:0)
好的朋友,看看这个totally sweet API documentation on the requestLocation
method!
基本上它说:
此方法立即返回。调用它会导致位置管理器获取位置修复(可能需要几秒钟)并使用结果调用委托的locationManager(_:didUpdateLocations :)方法。
这意味着如果您的班级订阅了locationManager的delegate
,您可以在locationManager(_:didUpdateLocations:)
的实施中添加第5,6和7行。
所以你的代码看起来像是:
func whateverFunction() {
whatever
whatever
whatever
[locationManager requestLocation];
}
func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
use the new location information
whatever
}
我希望这有帮助!
编辑:其实我觉得我误读了你的帖子。如果那是案例评论并让我知道,我会尝试编辑我的答案。