改变Objective-C中块内的值

时间:2011-07-17 23:10:49

标签: objective-c ios objective-c-blocks

我有一个代码块,它使用“__block”表示法将一个对象添加到块外部声明的数组(它是一个ivar)。但是,一旦退出块,该数组就不包含任何值。我知道它并没有尝试将空字符串添加到数组中,因为我的控制台正确地打印了字符串。任何帮助,将不胜感激。这是我的代码:

addressOutputArray = [[NSMutableArray alloc] init];

for(CLLocation *location in locationOutputArray)
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error)
     {
         if(placemarks && placemarks.count > 0)
         {
             CLPlacemark *topResult = [placemarks objectAtIndex:0];

             NSString *address = [NSString stringWithFormat:@"%@ %@,%@ %@", [topResult subThoroughfare],[topResult thoroughfare],[topResult locality], [topResult administrativeArea]];

             [addressOutputArray addObject:address];

             NSLog(@"%@",address);
         }

     }];

    [geocoder release];
}

NSLog(@"Address output array count: %d", [addressOutputArray count]);

最终日志给我的计数为零。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:5)

问题是reverseGeocodeLocation异步执行,并且在记录输出数组的大小之前,您没有等待完成调用。你可能会有更好的运气:

for(CLLocation *location in locationOutputArray)
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error)
     {
         if(placemarks && placemarks.count > 0)
         {
             CLPlacemark *topResult = [placemarks objectAtIndex:0];

             NSString *address = [NSString stringWithFormat:@"%@ %@,%@ %@", [topResult subThoroughfare],[topResult thoroughfare],[topResult locality], [topResult administrativeArea]];

             [addressOutputArray addObject:address];

             NSLog(@"%@",address);
             NSLog(@"Address output array count is now: %d", [addressOutputArray count]);
         }

     }];

    [geocoder release];
}

在任何情况下,您正在使用块进行正确的操作,无论您如何设置它并使用它来修改addressOutputArray ivar的状态。唯一的问题是,在检查结果之前,你没有等到所有块都完成执行。