使用CLLocationManager的自定义位置管理器类

问题描述:

我对iOS开发(我的第一个应用程序)很新,我遇到了这个问题。使用CLLocationManager的自定义位置管理器类

我有一个iPhone应用程序,应该在用户按钮触摸时在多个ViewControllers中获取用户的当前位置。为了防止冗余代码(执行locationManager:didFailWithErrorlocationManager:didUpdateToLocation:fromLocation等不同视图控制器多次)我决定创建称为LocationManager的自定义类:

LocationManager.h

@interface LocationManager : NSObject <CLLocationManagerDelegate> { 
@private 
    CLLocationManager *CLLocationManagerInstance; 
    id<LocationManagerAssigneeProtocol> assignee; 
} 

-(void) getUserLocationWithDelegate:(id) delegate; 

LocationManager.m我有一个协议叫LocationManagerAssigneeProtocol我ViewControllers实现

@protocol LocationManagerAssigneeProtocol <NSObject> 

@required 
-(void) didUpdateToLocation:(CLLocation *) location; 

@end 

,在我的ViewController在需要的地方

- (IBAction)getMyLocation:(id)sender { 

    [locationMgr getUserLocationWithDelegate:self]; 
} 

此代码的工作完美,但是,我有我在这里,违反了一些设计模式,通过让LocationManager的感觉能够调用自己启动对位置管理器调用的类的功能。另一方面,我不希望执行CLLocationManagerDelegate为所有我应该与地点工作的视图控制器。

这个问题有没有更好的解决办法?

+0

我不确定我关注“让LocationManager能够调用自己发起呼叫的类的功能”。如果我没有弄错,你使用委托协议来做这件事,这是可取的。 –

+0

我认为这很好,这就是委派的工作原理,尽管只有协议上没有依赖类。我建议的唯一的事情是,如果您拥有多个视图控制器(取决于位置更新的相同实例),也许您可​​能想切换到基于通知的系统。 –

+0

@CarlVeazey请给我们举一个例子,说明你会改变什么来使它成为通知的基础? –

我同意@CarlVeazey在这一个。代表非常适合在任何时候存在1对1关系,但在您的情况下,似乎您可能需要多个viewController来在任何给定时间响应位置事件。所以,只要删除与您的委托及其相关协议相关的任何内容即可。

我可能会做的LocationManager类独立的,并修改方法更新:

+(LocationManager *)sharedInstance 
{ 
    static LocationManager *_sharedInstance = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     _sharedInstance = [[self alloc] init]; 
    }); 

    return _sharedInstance; 
} 

-(void)getUserLocation 
{ 
    if ([CLLocationManager locationServicesEnabled]) 
     [CLLocationManager startUpdatingLocation]; 
} 

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    [CLLocationManagerInstance stopUpdatingLocation]; 
    [[NSNotificationCenter defaultCenter] postNotificationWithName:@"LocationManagerDidUpdateLocation" object:newLocation]; 
} 

...那么需要使用这个类的任何的viewController会碰到这样的:

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserverForName:@"LocationManagerDidUpdateLocation" object:self queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { 
     CLLocation *location = note.object; 
     ... 
    }]; 
} 

-(IBAction)getMyLocation:(id)sender { 
    [[LocationManager sharedInstance] getUserLocation]; 
} 

希望帮助和合理。