gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:50:07 26 4
gpt4 key购买 nike

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

-(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;
}

最佳答案

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

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

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

编辑:像其他人建议的那样,使用 __block 限定符声明 zipCode

关于iphone - 如何在 ios 中进行函数调用等待,直到该函数内的 block 完全执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12243871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com