6

我需要一種方法來獲取我的用戶當前位置。iPhone核心位置架構 - 如何跨多個控制器使用它

因爲用戶有朋友,而且他們有位置數據,以及,我雖然走的正確方法是把一個位置字段在我的核心數據分貝,無論是在FriendUser實體。

現在,這裏就是我想:

有某種位置經理singelton的,每當我需要的準確位置我告訴他,開始CLLocationManager更新。 (我的經理負責) 經理將保存位於Db user.location字段中的位置,並且對user.location信息感興趣的控制器將使用KVO註冊該數據。 對我來說這聽起來很不錯,除了我必須從每個需要準確位置的控制器訪問此位置singelton(爲了告訴他開始生成位置,我不希望位置更新始終都是) 。另外我儘量不要用一堆singelton調用來污染我的代碼。

我雖然也許明智的做法是將位置管理器作爲我的User類中的一個屬性。 (顯然,如果我現在有幾個用戶在內存中,他們將共享相同的位置管理器singelton) 我會向用戶類添加另一種方法並將其稱爲「StartGettingLocation」,現在每當某個控制器需要當前的準確位置,他可以做下列之一:

  1. 如果在我的控制器我有一個用戶對象(這是由其他的UIViewController傳承下去),我只是叫他「StartGettingLocation」方法和KVO他的位置字段。
  2. 如果我沒有在我的控制器中的用戶對象,我從我的數據庫中得到它,並按照上述做。

聽起來不錯?

如果是這樣,我不確定是否可以將MyLocationManager的新成員添加到我的User類(它是managedObject的子類)? 什麼是正確的方法來實現這一目標?

感謝

回答

4

我們實現我們的CoreLocationManager作爲sharedInstance(單)模式。我不確定您希望您的託管對象擁有CoreLocation行爲,因爲它確實不是特定於User的設備,而是設備(即iPhone,iPad)。

CoreLocationManager確實不應該更新數據庫記錄。其目的是發送更新的位置。還有些東西需要監聽這些更新,所以你可以讓其他東西實現CLLocationManagerDelegate,這反過來可以更新託管對象。

或者,您可以讓CoreLocationManager成爲自己的代理人,並在CLLocation上擁有@property。您可以使用KVO通知觀察員您的建議已改變位置。我想這一切都取決於一個位置是否只與用戶有關,或者如果某個位置是任何可以使用的位置。

+0

我不認爲你的CoreLocationManager負責發送位置更新,這是蘋果的CLLocationManager責任。我希望你的CoreLocationManager符合CLLocationManagerDelegate。然後它會決定如何將位置更新保存到數據庫或者只是發佈相關通知。是的,位置只是相對於當前登錄的用戶,因此使其他控制器KVO聽起來很合理。希望我能正確理解你。 – Idan 2012-04-03 07:10:07

+0

你是對的。我們的CoreLocationManager不發送位置更新,它僅僅是'CLLocationManager'的包裝器。我們有方法從管理器啓動/停止CLLocationManager實例。我們還實現CLLocationManagerDelegate以更新管理器上的CLLocation屬性。對不起,如果我沒有說得很清楚。 – 2012-04-03 17:16:55

+0

對,你怎麼讓其他控制器知道位置變化的時間?你是否發佈通知?保存到您的數據庫並讓其他KVO呢? – Idan 2012-04-04 20:39:00

2

我通常把我的位置管理器作爲應用程序委託的屬性,然後很容易從應用程序的任何位置以[[[UIApplication sharedApplication] delegate] myLocationManager]的方式訪問。這也是方便在AppDelegate.h文件中像使用的#define ...

#define commonLocationManager [[[UIApplication sharedApplication] delegate] myLocationManager] 

這樣,你只包括你需要從commonLocationManager.someReallyCoolProperty訪問位置的任何類的應用程序委託頭。

編輯:

每當我需要我的UI來反映位置的變化,或任何其他國家對於這個問題,我用key-value observing(志願)。