0

如何管理在循环中调用异步块?

我的代码被称为 n 次:

- (void) convertToCountries:(NSString*)time longitude:(NSString*)lon latitude:(NSString*)lat {


CLLocation *myLocation = [[CLLocation alloc] initWithLatitude:[lat doubleValue] longitude:[lon doubleValue]];


[geocoder reverseGeocodeLocation:myLocation
               completionHandler:^(NSArray *placemarks, NSError *error) {
                   NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");

                   if (error){
                       NSLog(@"Geocode failed with error: %@", error);
                       return;
                   }

                   if(placemarks && placemarks.count > 0)
                   {
                       //do something
                       CLPlacemark *topResult = [placemarks objectAtIndex:0];
                       NSString *addressTxt = [NSString stringWithFormat:@"%@, %@ %@,%@ %@", [topResult country],
                                               [topResult subThoroughfare],[topResult thoroughfare],
                                               [topResult locality], [topResult administrativeArea]];
                       NSLog(@"%@",addressTxt);

                       NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                       [formatter setDateFormat:@"yyyy-MM-dd"];

                       //Optionally for time zone converstions
                       [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];


                       [DataOperations saveRecord:[topResult country] time:time];

                   }
               }];

}

我需要从这些调用中收集输出数据。

任何帮助将不胜感激。

4

1 回答 1

1

给你的对象一个属性,BOOL dunloadin.

然后,在完成块中,设置self.dunloadinYES.

最后,您的循环应如下所示:

for (int i=0; i<10; i++)
{
    self.dunloadin = NO;
    [self convertToCountries:…];

    while (!self.dunloadin)
    {
        [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
}

但是,您可能需要考虑以不同的方式设计您的应用程序,这样就不需要像这样的杂乱无章了。

于 2012-10-10T12:29:14.740 回答