Why is this CLLocationCoordinate2D variable unassignable?

后端 未结 1 364
情歌与酒
情歌与酒 2021-01-17 01:50

I have a geocoder method and I want it to return the CLLocationCoordinate2D that it generates for me.

- (CLLocationCoordinate2D)geocode{
    CLGeocoder *geo         


        
相关标签:
1条回答
  • 2021-01-17 02:25

    You have to use the __block keyword if you want to assign to a variable that was defined outside the block's scope:

    __block CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0);
    

    Have a look at the Blocks and Variables section of Apple's Block Programming Topics

    About the variable not getting set when it compiles:

    geocodeAddressDictionary:completionHandler: runs asynchronously. That means it returns immediately but the block gets executed later, when the results are available. You need to change the way you call your methods. At the moment you are probably doing something like this

    self.myCoordinate = [self geocode];
    

    What you have to do is more like this:

    - (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");
            }
        }];
    }
    

    Running [self geocode] returns immediately and myCoordinate will be set when the block runs.

    If you are doing it that way, note that this could lead to a reference cycle, because self is being retained by the block.

    0 讨论(0)
提交回复
热议问题