如何使iOS中的函数调用来等待,直到该函数内部块被完全执行?(How to make a funct

2019-07-31 08:15发布

里面的下面的函数,我用了一个块。 但是,当我调用此函数,它是指在执行块甚至之前返回。 我明白座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;
    }

Answer 1:

首先,我会建议重新考虑你的设计。 而不是从该方法返回邮政编码值的,调入在completionHandler(创建一个协议/委托或任何)一些其它方法。 该reverseGeocodeLocation::方法可能需要一些时间,你不想暂停主线程在等待结果的执行。

如果你想阻止不过,你可能会考虑使用(滥用?)一个dispatch_semaphore_t 。 它初始化为0, dispatch_semaphore_wait调用后reverseGeocodeLocation:: 。 在completionHandler与信号,它dispatch_semaphore_signal

更多信息: 使用调度信号灯来调节有限资源的使用

编辑:和别人一样的建议,宣布邮编用__block预选赛



文章来源: How to make a function call in ios to wait, till the block inside that function is executed completely?