0

出于某种原因,当我将其记录在括号内时,我得到了一个邮政编码,但当我尝试在括号外记录时,我得到了一个 (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

4 回答 4

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.
}];
于 2013-09-15T11:43:39.047 回答
0

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

你可能想分成两种不同的方法。

- (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);**
}
于 2013-09-15T09:58:47.390 回答
0

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

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

在那之前,那里定义的任何东西都不会运行。

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

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

于 2013-09-15T09:42:27.103 回答
0

这是因为您在一个块内获得了 zip。它比紧随其后的代码稍晚调用。因此,如果您尝试在这些括号之外访问 zip,则您的 zip 尚未初始化。您需要熟悉块的工作原理。这是一个很好的教程:块教程

也看看官方文档苹果官方文档

于 2013-09-15T09:42:38.267 回答