Изменение значений внутри блоков в Objective - C - PullRequest
3 голосов
/ 18 июля 2011

У меня есть блок кода, который добавляет объект в массив, объявленный вне блока с нотацией "__block" (это ivar).Однако после выхода из блока массив не содержит значений.Я знаю, что он не пытается добавить пустые строки в массив, потому что моя консоль печатает строки правильно.Любая помощь будет оценена.Вот мой код:

addressOutputArray = [[NSMutableArray alloc] init];</p> <pre>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 Ответ

5 голосов
/ 18 июля 2011

Проблема в том, что 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 ивара. Единственная проблема в том, что вы не дожидались завершения выполнения всех ваших блоков, прежде чем проверяли результат.

...