使用CLLocationManager的自定义位置管理器类
问题描述:
我对iOS开发(我的第一个应用程序)很新,我遇到了这个问题。使用CLLocationManager的自定义位置管理器类
我有一个iPhone应用程序,应该在用户按钮触摸时在多个ViewControllers中获取用户的当前位置。为了防止冗余代码(执行locationManager:didFailWithError
,locationManager: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为所有我应该与地点工作的视图控制器。
这个问题有没有更好的解决办法?
答
我同意@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];
}
希望帮助和合理。
我不确定我关注“让LocationManager能够调用自己发起呼叫的类的功能”。如果我没有弄错,你使用委托协议来做这件事,这是可取的。 –
我认为这很好,这就是委派的工作原理,尽管只有协议上没有依赖类。我建议的唯一的事情是,如果您拥有多个视图控制器(取决于位置更新的相同实例),也许您可能想切换到基于通知的系统。 –
@CarlVeazey请给我们举一个例子,说明你会改变什么来使它成为通知的基础? –