在模型中使用Delegates在它们之间传递信息

时间:2014-02-08 20:37:03

标签: ios objective-c delegates cllocationmanager cllocation

我想发出HTTP请求,部分请求包含lat和lng。

要获得这些,我有一个位置模式。其中一位代表让我知道它何时准备就绪。当发生这种情况时,我会调用我的Foursquare模型中实现的自定义委托。

我通过创建Location模型的实例并调用startUpdatingLocation方法在MainViewController中启动所有内容。实现看起来像这样:

位置模型:

- (void)startLocationManager
{
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    _locationManager.delegate = self;

    [_locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"Error:%@", error.userInfo);
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    if (locations) {
        _location = [locations lastObject];
        [self.delegate location:self didFinishFindingLocation:_location];
    }

}

Foursquare模特:

- (void)location:(Location *)loc didFinishFindingLocation:(CLLocation *)location
{
    NSString *search = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?ll=%f,%f&radius=2000&categoryId=4d4b7105d754a06374d81259&client_id=%@&client_secret=%@&v=%@", location.coordinate.latitude, location.coordinate.longitude, kFourdquareAPIKey, fFoursquareSecret, [Foursquare getCurrentDate]];

    NSURL *url = [NSURL URLWithString:search];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];

    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSDictionary *dataDictionary = (NSDictionary *)[NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        self.dataResponse = dataDictionary[@"response"][@"venues"];
        NSLog(@"%@", self.dataResponse);
    }];

    [task resume];
}

最后,我在我的MainViewController中执行此操作:

Location *location = [[Location alloc] init];
[location startLocationManager];

没有任何内容记录到控制台,并且模拟器不会要求我获取位置的权限。没有。

1)使用这样的代表是错误的吗? 2)有更好的方法吗?

鉴于1的答案是否定的,我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

您是否为location:didFinishFindingLocation:方法设置了代理?从上面的代码看起来不像它 无论如何,虽然它可能有用,但这不是正确的方法。如果您需要模型进行通信,那么同时将它们分离的最佳方法是本地通知 您可能需要阅读this article以了解它们的工作原理。

答案 1 :(得分:-1)

你是在四个square.m中初始化吗?     位置* location = [[Location alloc] init];     location.delegate = self;