2016-09-30 26 views
0

我是iOS新手,有一个基本问题。直到现在,我通过在locationManager对象中打开位置更新来获取iPhone的位置。之后,我的代码结束了,并且当委托方法didUpdateLocations被调用时,我得到了位置。获取iPhone位置更新而不终止当前代码线程

但现在我想获得一个位置更新,做它从一个代码序列中是这样的:1

线:无论

线路2:无论

3号线:不管

4行:[的LocationManager requestLocation]

第5行:等待位置进行更新

6号线:使用新的位置信息

7号线:无论

但我意识到,didUpdateLocations不会被调用,而上面的线是在“等待位置更新“。

处理这种情况的正确方法是什么?

我是否需要以某种方式请求位置更新发生在另一个线程上,以便我上面的线程可以保持并行运行?

感谢,

史蒂夫

新编辑:

比方说,我这样做didUpdateLocations内:上一个全局变量设置一个标志,表明该位置已经被更新(即locationUpdated = 1)并设置location = updated_location。

然后在第5行(上面的例子)我等待locationUpdated == 1.然后在第6行我可以使用“位置”变量。

这样写代码有意义吗?

在我的实验中,如果我等待循环轮询locationUpdated == 1,它将阻止didUpdateLocations被调用。所以也许这是GrandCentralDispatch将等待循环放入不同线程的工作?我从来没有用过它。

+0

当位置正在更新时,您是否需要线程暂停?或者您是否希望位置更新在后台进行,同时在调用位置更新后继续正常执行程序? –

+0

位置更新将始终以异步方式传递给委托方法。你不需要主动“等待”。一旦委托方法被调用,你就可以做任何事情。您可能需要向用户提供正在进行处理的一些指示。 – Paulw11

+0

我想我的代码暂停,直到我有一个有效的位置修复程序。我想在下一行代码中使用该位置信息(在我的示例中为第6行)。我可以从didUpdateLocation方法内更新一个全局变量(包含位置),第6行将会看到这个变量的更新值。听起来像是我的并发...我还没有用过的东西。 – Morocco5

回答

0

好吧朋友,看看这个totally sweet API documentation on the requestLocation method

基本上它说:

此方法将立即返回。调用它会导致位置管理器获取位置修正(可能需要几秒钟),并使用结果调用委托的locationManager(_:didUpdateLocations :)方法。

这意味着,如果你的类订阅了的LocationManager的delegate,你可以把线5,6,7在你的实现locationManager(_:didUpdateLocations:)

所以,你的代码看起来像:

func whateverFunction() { 
    whatever 
    whatever 
    whatever 
    [locationManager requestLocation]; 
} 

func locationManager(_ manager: CLLocationManager, 
     didUpdateLocations locations: [CLLocation]) { 
    use the new location information 
    whatever 
} 

我希望这有助于!

编辑:其实我认为我误解了你的帖子。如果是这种情况的评论,让我知道,我会尝试编辑我的答案。

+0

感谢您的意见。我可以按照您的建议进行操作,但我不想使用didUpdateLocations方法中的新位置信息。我想在我的序列的下一行(第6行)使用这个新的信息。 – Morocco5

+0

@ Morocco5我有一种感觉,你太过复杂了,应该找出一种方法来重构你的代码,以便你可以正确地使用代表。这是iOS开发的一个非常重要的范例。 – Zolnoor