2013-12-23 54 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

如果一个惯例妨碍你的话,那就不要使用它。

您想权衡保持位置管理器在内存中的花费,而不是初始化需要多长时间。如果说,每次启动位置管理器,它都会花费一分钟,然后是的,您会希望将某个实例保留在某个方便的位置,例如应用程序委托并在其他位置访问它。同样,如果经理几乎是瞬间的,但内存昂贵,通常只有在需要时才能制作和使用它。

相关问题