我有一个代码块,它使用“__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]);
最终日志给我的计数为零。任何帮助都会非常感激。
答案 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的状态。唯一的问题是,在检查结果之前,你没有等到所有块都完成执行。