我有2个类作为NSObject子类:
第一类更有可能充当适配器。它将数据发送到Class2以进行进程异步任务。当委托人解雇时,我想将数据发回到适配器类。
在适配器类中:
Class2 *cls = [[Class2 alloc] init];
[ftc fetchLocation];
在Class2.m
中-(void)fetchLocation{
if(IS_OS_8_OR_LATER) {
[self.locationManager requestAlwaysAuthorization];
}
self.locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]){
NSLog(@"Enable");
}
self.locationManager.delegate =self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestAlwaysAuthorization];
[self.locationManager startUpdatingLocation];
}
当我从适配器调用fetch-location方法时,它实际上调用并读取行,但之后,Class2消失并返回到Adapter类而不等待委托(didUpdateLocations)
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
NSString *latitude = [NSString stringWithFormat:@"%f",self.locationManager.location.coordinate.latitude];
NSString *longtitude = [NSString stringWithFormat:@"%f",self.locationManager.location.coordinate.longitude];
NSString *altitude = [NSString stringWithFormat:@"%f",self.locationManager.location.altitude];
NSString *speed = [NSString stringWithFormat:@"%f",self.locationManager.location.speed];
NSDictionary *locationDictionary = @{@"latitude":latitude,@"longtitude":longtitude,@"altitude":altitude,@"speed":speed};
if (locations.count >0 && [locations isKindOfClass:[NSArray class]]) {
[self.delegate userLocationHasUpdated:self :locationDictionary];
[self.locationManager stopUpdatingLocation];
self.locationManager = nil;
return;
}
}
但是,如果我只运行Class2并从编译器中移除适配器(使用第一个初始化器),它将按预期运行,如何实现从另一个触发的类处理委托方法?
最诚挚的问候。
答案 0 :(得分:1)
你有几个选择,真的。一个人可能会让你的第二堂课成为你的第一堂课的属性(单身模式在这里很合适,我猜)。然后,您可以在第二个类中声明协议,并通过委托方法(非单例实现)通知您的第一个类,或使用NSNotificationCenter
发布通知(单例实现)。
第二个选项是将带有完成处理程序的块传递给第二个类。你可以像这样在第二个类中声明你的方法,例如(如果需要的话,调整块的返回类型和参数):
- (void)updateLocationWithCompletionHandler:(void (^)(void))completion;
实施它,以便在获得地理位置更新结果后调用completion
块。
从第一堂课中调用它,如:
[self.secondClass updateLocationWithCompletionHandler:^
{
// Your completion code here.
}];
希望这有帮助(对不起,没有检查Xcode中的代码,摆脱拼写错误,如果有的话)。
答案 1 :(得分:1)
iOS CLLocationManager in a separate class可能重复。如果你想要有一个单独的类来处理位置管理器,你必须创建一个单例类来获取位置。您可以从共享链接中找到指导