2013-12-23 97 views
2

我的應用程序監視用戶位置,包括一些背景位置監視。在我的AppDelegate中保留一個CLLocationManager是否是一種好習慣?

我在我的App Delegate中有一個位置管理器,主要用於初始啓動位置以及後臺更新。然後,我在視圖控制器(地圖)內部安排了另一位經理,以獲取更具體的事件和快速參考。

我想知道,如果它是重構爲一個實例就是一個很好的做法,保持應用程序委託,並使用引用它整個應用程序:

self.appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

[self.appDelegate.locationManager startUpdatingLocation]; 
+0

有很多方法可以做到,但應用程序委託是合理的。或者,你也可以在自己的類中擁有一個單例 - 一個通過屬性公開的靜態CLLocationManager對象。 – EricS

+1

在MVC之後,您的視圖控制器應該...控制您的視圖。應該*告訴*要顯示什麼數據,其邏輯應該與用戶如何看待數據以及如何與數據交互有關。它不應該負責從Web服務器或CLLocationManager獲取數據。因此,除非您的應用程序非常簡單,否則CLLoctionManager既不屬於您的應用程序委託也不屬於您的視圖控制器。 –

回答

4

要在其他評論者建議什麼擴大,我也建議把它變成自己的類,像這樣:

// Header 
@interface MyLocationManager : NSObject 
+ (MyLocationManager *)sharedInstance; 
@property (readonly) CLLocationManager *locationManager; 
@end 


// Implementation 
@implementation MyLocationManager 
- (id)init 
{ 
    self = [super init]; 

    if (self) { 
     _locationManager = /* set up your location manager */; 
    } 

    return self; 
} 

+ (MyLocationManager *)sharedInstance 
{ 
    static MyLocationManager *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[MyLocationManager alloc] init]; 
    }); 
    return sharedInstance; 
} 
@end 

然後你就可以在你的應用程序中使用您的MyLocationManager隨時隨地通過調用[MyLocationManager sharedInstance]

+1

我最後在本週末重構了我的代碼並實現了一個單獨的「LocationController」。輝煌 - 非常感謝。 – darkheartfelt

+0

@darkheartfelt我很高興它爲你工作! –

2

我認爲這將是最好有一個類來處理的位置,繼Single Responsibility Principle,讓事情SOLID

在面向對象的編程,單一職責原則 狀態,每類應該有一個責任,那職責應完全由班級封裝。其所有 服務應該與該責任完全一致。

1

如果一個慣例妨礙你的話,那就不要使用它。

您想權衡保持位置管理器在內存中的花費,而不是初始化需要多長時間。如果說,每次啓動位置管理器,它都會花費一分鐘,然後是的,您會希望將某個實例保留在某個方便的位置,例如應用程序委託並在其他位置訪問它。同樣,如果經理幾乎是瞬間的,但內存昂貴,通常只有在需要時才能製作和使用它。

相關問題