如何在ios中进行函数调用等待,直到该函数内的块完全执行?

时间:2012-09-03 07:49:57

标签: iphone objective-c ios5 objective-c-blocks

在以下功能中,我使用了一个块。但是当我调用这个函数时,它甚至在块执行之前就会返回。我知道Block inturn使用线程并单独执行,因此函数不会等待它返回。但是,有没有其他方法可以让函数执行等待,或者在不使用块本身的情况下以任何其他方式实现此块的功能?

-(int)findCurrentZip
{
        CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:[self findCurrentLatitude]
                                                              longitude:[self findCurrentLongitude]];
         int zipcode;
        self.myGeocoder = [[CLGeocoder alloc] init];
        [self.myGeocoder 
         reverseGeocodeLocation:userLocation
         completionHandler: (id)^(NSArray *placemarks, NSError *error) {
             if (error == nil && [placemarks count] > 0)
             {
                 NSLog(@"Placemarks: %@",placemarks);
                 CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
                 NSLog(@"Country = %@", placemark.country);
                 NSLog(@"Postal Code = %@", placemark.postalCode);
                 zipcode = (int)placemark.postalCode;
                 NSLog(@"Locality = %@", placemark.locality);
                 NSLog(@"Country%@",[placemarks lastObject]);
             }
             else if (error == nil && [placemarks count] == 0)
             {
                 NSLog(@"No results were returned.");
             }
             else if (error != nil)
             {

             }
        }];

        return zipcode;
    }

1 个答案:

答案 0 :(得分:8)

首先,我建议重新考虑你的设计。而不是从此方法返回zipCode值,而是调用completionHandler中的其他方法(创建协议/委托或其他)。 reverseGeocodeLocation::方法可能需要一些时间,您不希望暂停执行等待结果的主线程。

如果您确实想阻止,可以考虑使用(滥用?)a dispatch_semaphore_t。在调用dispatch_semaphore_wait后将其初始化为0和reverseGeocodeLocation::。在completionHandler中用dispatch_semaphore_signal发信号。

更多信息:Using Dispatch Semaphores to Regulate the Use of Finite Resources

编辑:和其他人一样,使用__block限定符

声明zipCode