【问题标题】:Variable is null after setting it within a block变量在块内设置后为空
【发布时间】:2012-05-12 04:07:57
【问题描述】:

我想我不明白在这种情况下块是如何工作的。我正在尝试从 CLGeocoder 获取位置并在块完成后保存 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 地点确实会添加到地图中。但是,如果我记录该值,则它为 NULL。我认为这可能是因为该块没有立即执行,对吧?所以我的 NSLog 可能会先执行,然后完成处理程序运行。但是,我将如何从该方法返回 MKPlacemark,以便可以在代码的其他地方使用该值?谢谢。

【问题讨论】:

  • 您的 place 变量可能为零,因为没有返回地标,因此您永远不会输入 if 语句。您是否在 if 语句中设置了断点并确保它执行?

标签: iphone


【解决方案1】:

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

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

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

是的,你的 NSLog(@"%@", [place description]);将在块执行之前运行。

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

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);

}

【讨论】:

  • 我需要一个 ivar 而不是让方法返回它的原因是什么?
  • 因为 placeMarkFromString 是一个异步方法。如果您想从方法中“返回”位置,请参阅上面的编辑。
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多