出于某种原因,当我在括号内记录时,我得到一个邮政编码,但当我尝试在括号外登录时,我得到一个(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,^{
});
它解决了问题!谢谢大家!
答案 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.
}];