记录当前方法之外的问题

时间:2013-09-15 09:39:05

标签: ios objective-c

出于某种原因,当我在括号内记录时,我得到一个邮政编码,但当我尝试在括号外登录时,我得到一个(null)。我还在我的头文件中声明了“zip”。我确信这不是一件容易的事。一点帮助?

    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    [locationManager startUpdatingLocation];

    CLGeocoder *fgeo = [[CLGeocoder alloc] init];
    [fgeo reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray     *placemarks, NSError *error) {
        if (!error) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            self.zip = placemark.postalCode;
            **NSLog(@"%@", _zip);**
        }
        }];
    **NSLog(@"%@",self.zip);**

问题已解决 编辑:

好的,我能够通过SIMON将块传递给我的下一个方法:

CLGeocoder *fgeo = [[CLGeocoder alloc] init];
    [fgeo reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray     *placemarks, NSError *error) {
        if (!error) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            self.zip = placemark.postalCode;
            **NSLog(@"%@", _zip);**
[self someMethod];

我发现我最后一遍又一遍地调用同一个块。所以我能够使用以下代码来阻止我的代码循环并崩溃我的应用程序,我将我的块包装在以下内容中:

static dispatch_once_t once;

并将我的代码包装在此:

dispatch_once(&once,^{

});

它解决了问题!谢谢大家!

4 个答案:

答案 0 :(得分:0)

您在那里使用的完成处理程序是异步的。

reverseGocodeLocation:completionHandler:将在完成计算时调用您定义的块(无论何时)。

在那之前,那里没有任何定义。

发布块后,下一行代码(外部NSLog)按常规运行。

因此在完成处理程序之前运行,并且在self.zip之前有值。

答案 1 :(得分:0)

这是因为你在一个街区内获得了拉链。它比它之后的代码稍晚一点。因此,如果您尝试在这些括号外访问zip,则您的zip尚未初始化。你需要的是熟悉块的工作方式。这是一个很好的教程:Blocks tutorial

另请查看官方文档Apple official documentation

答案 2 :(得分:0)

括号内的代码(completionHandler aka callback)将异步执行。

您可能希望分为两种不同的方法。

- (void)someMethodYouCall {
    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    [locationManager startUpdatingLocation];

    CLGeocoder *fgeo = [[CLGeocoder alloc] init];
    [fgeo reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray     *placemarks, NSError *error) {
    if (!error) {
        CLPlacemark *placemark = [placemarks objectAtIndex:0];
        self.zip = placemark.postalCode;
        **NSLog(@"%@", _zip);**
        [self secondPart];
    }
    }];
}

-(void) secondPart {
    **NSLog(@"%@",self.zip);**
}

答案 3 :(得分:0)

@Andrey,谢谢你的信息。我想分享一下我找到的,可能会帮助某人走上正轨。

http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C

  

使用块外部的变量有一个皱纹,   但是:默认情况下,它们被视为const,无法修改   (静态和全局变量是一个例外)。就是这样   以下代码产生编译器错误:

int matching = 0;
[objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (/* condition */)
    matching++; // Error since matching is const within the block!
}];
  

通过添加__block存储类型修饰符,我们可以使这段代码片段起作用:

__block int matching = 0;
[objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (/* condition */)
    matching++; // Can modify matching due to __block modifier.
}];