簡體   English   中英

跨多個視圖使用CoreLocation的最佳方法

[英]best way to use CoreLocation across multiple views

我的應用程序中有兩個視圖,一個是一般視圖,其中CoreLocation在用戶在視圖中執行其他操作時計算用戶位置。 用戶在觸摸按鈕時訪問第二個視圖,允許他們使用mapview和MapKit更准確地定位自己,我希望此視圖中的mapview顯示CoreLocation已在第一個視圖中識別的位置並繼續根據另一個視圖中CoreLocation的更新顯示此位置。

這是創建封裝CoreLocation內容的單例並在視圖中使用地圖引用或使用通知的最佳方法嗎? 或者為我的場景使用其他一些更好的練習?

謝謝

我有幾個在多個地方使用CoreLocation的應用程序。 從我讀過的內容來看,你肯定希望只有一個CLLocationManager實例。 它對我來說是一個很好的單身人士。

希望這可以幫助!

如果我是你,我會這樣做:

  1. 決定始終加載哪個視圖。 我假設,您希望一直加載CalculatingView ,並根據用戶操作加載/卸載MapView

  2. CalculatingView中分配並初始化指向CLLocationManager的指針。 這將提供位置屬性並調用委托消息。 由於加載並保留了CalculatingView ,因此該指針也始終有效。

  3. 如果此視圖已分配並初始化CLLocationManager指針,則將CLLocationManager的委托設置為CalculatingView ,也可稱為self

  4. CalculatingView中實現CLLocationManager的委托方法

  5. 如果您願意,可以在CalculatingView中分配和初始化MapView 但只要你可以向MapView發送消息,就可以在其他地方使用它。 通過檢查它是否為零或是否響應ToSelector來確保它們有效。

  6. CLLocationManager的委托(即CalculatingView)接收消息時,向MapView發送消息。

  7. 這就像轉發消息一樣,但MapView應該響應的消息不必是發送到CalculatingView的相同消息,就像來自CLLocationManager的委托方法調用一樣

  8. 通過檢查MapView是否有效,這意味着如果它被加載以顯示,您可以決定是否向MapView發送消息

本質是決定哪個視圖是否被加載,使用委托方法將消息發送(或中繼)到其他指針(在本例中為MapView指針)。

單身是好的,但除非你要從多個地方使用CLLocationManager ,比如超過3~4個地方,我認為沒有必要

希望我沒有混淆你。 根據您發布的內容,這種方式似乎可以為您的目標提供簡單的解決方案。 如果我沒有抓住你的真實意圖,請告訴我。

我不確定這是最好的方法,但我一直在設置我的主控制器(首先加載的控制器)作為位置管理器代表。 當位置更新時,它會以新位置作為通知對象觸發通知。 然后,任何偵聽控制器都可以使用該數據,但需要它們。

另外,Apple的LocateMe應用程序實例化了三次位置管理器。 因此,通過他們的例子,擁有多個LocationManagers可能不是問題。

根據我的閱讀,最佳做法是將CLLocationManager添加到App Delegate因為您可以從任何視圖訪問它。

簡短的示例代碼放在您需要CLLocationManager的視圖中

....imports....

@implementation YourViewController

- (void)viewDidLoad {
   self.myLocationManager = [[UIApplication sharedApplication] delegate].yourLocationManagerVarName;
}

@end

跳幫助。

也許你應該考慮一種面向MVC的方法。 根據您的描述,您缺少用戶的模型層表示。 使用基本CLLocation屬性定義一個簡單的User類將是第一步。

@interface User {}
@property (nonatomic, retain) CLLocation *location;
@end

@implementation User
@synthesize location;
- (void)dealloc {
  self.location = nil;
  [super dealloc];
}
@end

用戶的同一實例將傳遞給您的視圖控制器。 它可以在app委托中創建。

接下來為您的應用創建位置服務對象。 它將啟動CLLocationManager,並將位置提供給您的用戶。 您可能必須設置GPS准確度,忽略您不想要的幀,並在此處實現基本LBS邏輯。

此時,您有一個功能完整的應用程序,沒有任何UI。 這是一種可以重復使用和測試的好設計。

現在將您的UI疊加在其上。 為您的根控制器提供指向應用程序委托中的User實例的指針。 視圖控制器將此指針傳遞給它創建的模態/導航視圖控制器。

該控制器開始在viewDidLoad中觀察用戶的位置變化並做出相應的反應。

- (void)viewDidLoad {
   [self observeValueForKeyPath:@"location" ofObject:self.user change:0 context:NULL];
}

您的視圖控制器還會注冊您的位置服務對象引發的通知,以向用戶顯示警報。

基於其他答案:

  • 在代碼中創建多個CLLocationManager實例沒有真正的代價。 唯一的副作用是api是異步的,因此你必須等待在視圖控制器中獲得一個有效的位置。 您可以嘗試使用locationManager.location API從viewDidLoad上的位置管理器獲取當前位置。
  • 不要分享您的應用代表的東西。 這可以防止代碼重用。 如果您重復使用您的視圖並且您的app delegate沒有位置管理器,該怎么辦?

如果您需要更多代碼,請詢問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM