处理来自另一个 class 的 CLLocationManager 委托
Handling CLLocationManager delegate from another class
我有 2 个 classes 作为 NSObject 子classes:
1st class 更有可能充当适配器。它将数据发送到 Class2 以处理异步任务。当代表被解雇时,我想 post 将数据返回到适配器 class。
在适配器中 class:
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 消失并返回到适配器 class 而无需等待委托 (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 并从编译中删除适配器(使用第一个初始化程序)它 运行s 如预期的那样,我如何实现处理来自另一个 class 的委托方法开火了?
此致。
您确实有多种选择。一个可能是让你的第二个 class 成为你第一个 class 的 属性(我猜单例模式很适合这里)。然后你可以在你的第二个 class 中声明一个协议并通过委托方法(非单例实现)通知你的第一个 class 或使用 NSNotificationCenter
到 post 通知(单例实施)。
第二个选项是将带有完成处理程序的块传递给第二个 class。您可以在第二个 class 中声明您的方法,例如(如果需要,调整 return 块的类型和参数):
- (void)updateLocationWithCompletionHandler:(void (^)(void))completion;
实现它,以便在获得地理位置更新结果后调用 completion
块。
然后从第一个 class 开始调用它,例如:
[self.secondClass updateLocationWithCompletionHandler:^
{
// Your completion code here.
}];
希望这对您有所帮助(抱歉,没有检查 Xcode 中的代码,删除拼写错误,如果有的话)。
可能与 iOS CLLocationManager in a separate class 重复。如果你想有单独的 class 来处理位置管理器,你必须创建一个单例 class 来获取位置。您将从共享的 link
中找到指导
我有 2 个 classes 作为 NSObject 子classes:
1st class 更有可能充当适配器。它将数据发送到 Class2 以处理异步任务。当代表被解雇时,我想 post 将数据返回到适配器 class。
在适配器中 class:
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 消失并返回到适配器 class 而无需等待委托 (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 并从编译中删除适配器(使用第一个初始化程序)它 运行s 如预期的那样,我如何实现处理来自另一个 class 的委托方法开火了?
此致。
您确实有多种选择。一个可能是让你的第二个 class 成为你第一个 class 的 属性(我猜单例模式很适合这里)。然后你可以在你的第二个 class 中声明一个协议并通过委托方法(非单例实现)通知你的第一个 class 或使用 NSNotificationCenter
到 post 通知(单例实施)。
第二个选项是将带有完成处理程序的块传递给第二个 class。您可以在第二个 class 中声明您的方法,例如(如果需要,调整 return 块的类型和参数):
- (void)updateLocationWithCompletionHandler:(void (^)(void))completion;
实现它,以便在获得地理位置更新结果后调用 completion
块。
然后从第一个 class 开始调用它,例如:
[self.secondClass updateLocationWithCompletionHandler:^
{
// Your completion code here.
}];
希望这对您有所帮助(抱歉,没有检查 Xcode 中的代码,删除拼写错误,如果有的话)。
可能与 iOS CLLocationManager in a separate class 重复。如果你想有单独的 class 来处理位置管理器,你必须创建一个单例 class 来获取位置。您将从共享的 link
中找到指导