我对 iOS 开发(我的第一个应用程序)很陌生,我遇到了这个问题。
我有一个 iPhone 应用程序,它应该在用户按钮触摸时在多个 ViewControllers 中获取用户的当前位置。为了防止冗余代码(在不同的视图控制器中多次实现locationManager:didFailWithError
,等),我决定创建一个名为的自定义类:locationManager:didUpdateToLocation:fromLocation
LocationManager
位置管理器.h
@interface LocationManager : NSObject <CLLocationManagerDelegate> {
@private
CLLocationManager *CLLocationManagerInstance;
id<LocationManagerAssigneeProtocol> assignee;
}
-(void) getUserLocationWithDelegate:(id) delegate;
位置管理器.m
@implementation LocationManager
-(id)init {
self = [super init];
if(self) {
CLLocationManagerInstance = [[CLLocationManager alloc] init];
CLLocationManagerInstance.desiredAccuracy = kCLLocationAccuracyBest;
CLLocationManagerInstance.delegate = self;
}
return self;
}
-(void) getUserLocationWithDelegate:(id) delegate {
if([CLLocationManager locationServicesEnabled]) {
assignee = delegate;
[CLLocationManagerInstance startUpdatingLocation];
}
}
#pragma CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
...
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
[CLLocationManagerInstance stopUpdatingLocation];
[assignee didUpdateToLocation:newLocation];
}
我有一个名为LocationManagerAssigneeProtocol的协议,我的 ViewController 实现了该协议
@protocol LocationManagerAssigneeProtocol <NSObject>
@required
-(void) didUpdateToLocation:(CLLocation *) location;
@end
并在我需要的视图控制器中
- (IBAction)getMyLocation:(id)sender {
[locationMgr getUserLocationWithDelegate:self];
}
这段代码运行良好,但是,我觉得我在这里违反了一些设计模式,因为我允许LocationManager
调用本身发起对位置管理器的调用的类的函数。另一方面,我不想为所有应该使用位置的视图控制器实现CLLocationManagerDelegate 。
这个问题有更好的解决方案吗?