处理来自另一个类

时间:2015-05-28 07:58:16

标签: objective-c xcode ios8 cllocationmanager

我有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并从编译器中移除适配器(使用第一个初始化器),它将按预期运行,如何实现从另一个触发的类处理委托方法?

最诚挚的问候。

2 个答案:

答案 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可能重复。如果你想要有一个单独的类来处理位置管理器,你必须创建一个单例类来获取位置。您可以从共享链接中找到指导