2016-09-30 56 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