0

我有一个地理编码器方法,我希望它返回它为我生成的 CLLocationCoordinate2D。

- (CLLocationCoordinate2D)geocode{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0);

    [geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count]) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            coordinate = location.coordinate;
        } else {
            NSLog(@"error");
        }
    }];

    return coordinate;
}

但是,该行coordinate = location.coordinate会产生错误。XCode 说coordinate是一个不可赋值的变量。有人看到我做错了什么吗?

更新:

在遵循塞巴斯蒂安的建议后,我得到了要编译的代码,但是coordinate没有正确设置。如果您查看我在方法中放入的两个 NSLog 语句,第一个语句会打印出我需要分配给的正确坐标coordinate,但是一旦 if 语句退出,coordinate就会返回设置为 (0,0 )。第二个 NSLog 语句打印 (0,0)。有谁知道我该如何解决这个问题?

- (CLLocationCoordinate2D)geocode{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    __block CLLocationCoordinate2D geocodedCoordinate = CLLocationCoordinate2DMake(0,0);

    [geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count]) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            geocodedCoordinate = location.coordinate;
            NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude); 
        } else {
            NSLog(@"error");
        }
    }];

    NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude); 
    return coordinate;
}
4

1 回答 1

0

__block如果要分配给在块范围之外定义的变量,则必须使用关键字:

__block CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0);

查看Apple 的块编程主题块和变量部分

关于编译时未设置的变量:

geocodeAddressDictionary:completionHandler:异步运行。这意味着它会立即返回,但该块稍后会在结果可用时执行。您需要更改调用方法的方式。目前你可能正在做这样的事情

self.myCoordinate = [self geocode];

你要做的更像是这样的:

- (void)geocode{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count]) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            self.myCoordinate = location.coordinate;
            NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude); 
        } else {
            NSLog(@"error");
        }
    }];
}

运行[self geocode]立即返回,myCoordinate并将在块运行时设置。

如果您这样做,请注意这可能会导致引用循环,因为 self 被块保留。

于 2013-08-12T01:10:54.353 回答