获取iPhone位置更新,而不结束当前代码线程

时间:2016-09-30 21:41:04

标签: ios multithreading location

我是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将一个等待循环放在另一个线程中的工作呢?我从来没有用过它。

1 个答案:

答案 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
}

我希望这有帮助!

编辑:其实我觉得我误读了你的帖子。如果那是案例评论并让我知道,我会尝试编辑我的答案。