处理来自另一个 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

中找到指导