gpt4 book ai didi

iphone - 在 block 中设置变量后,变量为空

转载 作者:行者123 更新时间:2023-12-03 20:07:17 25 4
gpt4 key购买 nike

我认为我不明白 block 在这种情况下是如何工作的。我试图从 CLGeocoder 获取位置并在 block 完成后保存 MKPlacemark。所以在这个方法中:

- (MKPlacemark *)placeMarkFromString:(NSString *)address {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
__block MKPlacemark *place;
[geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
[placemarks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@", [obj description]);
}];

// Check for returned placemarks
if (placemarks && [placemarks count] > 0) {
CLPlacemark *topResult = [placemarks objectAtIndex:0];

// Create an MKPlacemark and add it to the mapView
place = [[MKPlacemark alloc] initWithPlacemark:topResult];
[self.mapView addAnnotation:place];
}

if (error) {
NSLog(@"Error: %@", [error localizedDescription]);
}
}];
NSLog(@"%@", [place description]);
return place;
}

当我运行代码时,MKPlacemark 地点确实会添加到 map 中。但是,如果我记录该值,它就是 NULL。我认为这可能是因为该 block 没有立即执行,对吧?所以我的 NSLog 可能会先执行,然后completionHandler 运行。但是,如何从此方法返回 MKPlacemark 以便我可以在代码中的其他位置使用该值?谢谢。

最佳答案

如果您想保留“位置”,请为其创建一个 self 的 ivar/property(无论 self 是什么)。将其声明为 __block 变量。然后执行:

self.place = [[MKPlacemark alloc] initWithPlacemark:topResult];

或者,如果您想跟踪多个位置,则可以创建一个 NSArray ivar,然后在每次 block 执行时将对象添加到数组中。

是的,你的 NSLog(@"%@", [地点描述]);将在 block 执行之前运行。

编辑:如果您想从此方法“返回”位置,您需要使您的方法成为如下所示的 block 方法:

typedef void (^SuccessBlock)(id);
typedef void (^FailureBlock)(NSError *);

- (void)placeMarkFromString:(NSString *)address withSuccess:(SuccessBlock)success andFailure:(FailureBlock)failure {

... //inside the enumerateObjectsUsingBlock block
success(place);

...
failure(error);

}

关于iphone - 在 block 中设置变量后,变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557167/

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