gpt4 book ai didi

ios - Objective-C 从嵌套 block 返回方法声明的对象

转载 作者:行者123 更新时间:2023-12-01 16:48:27 24 4
gpt4 key购买 nike

在以下代码块中,第一个方法调用第二个方法,该方法应返回地理编码过程的结果:

- (void)foo {
CLPlacemark *currentMark = [self reverseGeocodeLocation:locationManager.location];
}

- (CLPlacemark *)reverseGeocodeLocation:(CLLocation *)location {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
__block CLPlacemark *placeMark;
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
if (!error) {
if ([placemarks firstObject])
placeMark = [placemarks firstObject];
}
}];
return placeMark;
}

但是,由于程序的执行,在继续之前不会等待地理编码完成(因此是完成 block ),所以总是存在 placeMark 的危险。在地理编码过程完成并调用完成 block 之前,变量将未经实例化返回。在向 Web 服务发出 HTTP 请求时,我遇到了同样的困境,其结果在不确定的时间内不会返回。

到目前为止,我看到的唯一解决方案是嵌套 foo 中的所有代码在地理编码器的完成 block 中,它很快变得非常丑陋且难以维护。
currentMark 的最佳方式是什么? foo 中的变量设置为第二个方法的完成 block 的结果而不将其嵌套在 block 中?

最佳答案

无需让函数返回值,只需添加回调 block 即可返回值。

试试这个:

- (void)reverseGeocodeLocation:(CLLocation *)location withCallback:(void(^)(CLPlacemark *resultPlacemark, NSError *error))_block {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
_block([placemark objectAtIndex:0], error);
}];
}

然后 foo 将是
 - (void)foo {
__block CLPlacemark *currentMark;
[self reverseGeocodeLocation:(CLLocation *)location withCallback:(CLPlacemark *mark, NSError *error) {
currentMark = mark;
}];
}

关于ios - Objective-C 从嵌套 block 返回方法声明的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18151693/

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