iOS 转发地理编码块未执行

Posted

技术标签:

【中文标题】iOS 转发地理编码块未执行【英文标题】:iOS forward geocoding block not being executed 【发布时间】:2011-12-18 02:49:11 【问题描述】:

为什么这段代码没有被执行?我从我的另一个项目中复制并粘贴了它,它工作得很好。我还在我的另一个应用程序中尝试了它,使用我在这里插入的相同 addressString,它运行良好。

    NSString *addressString = [NSString stringWithFormat:@"%@ and %@, %@, NY", street, rightBound, [boroughs objectForKey:borough]];
    NSLog(@"Address string: %@",addressString);

    [geocoder geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error)
    
        NSLog(@"Placemark count:%d",[placemarks count]);

        for(CLPlacemark *placemark in placemarks)
        
            NSLog(@"%@",placemark);
        

        if(anError)
        
            NSLog(@"Error: %@",[error description]);
        
    ];

任何地标和错误消息都不会记录到控制台。

这是我的整个 AppDelegate.m:

@implementation AppDelegate

@synthesize window = _window;

- (void)dealloc

    [_window release];
    [super dealloc];


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    NSError *error = nil;
    SBJsonParser *parser = [[SBJsonParser alloc] init];

    NSString *JSONString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Streets" ofType:@"json"] encoding:NSUTF8StringEncoding error:&error];

    if(error)
    
        NSLog(@"%@",[error description]);
        NSLog(@"Break");
    

    NSDictionary *dict = [parser objectWithString:JSONString error:&error];
    if(error)
    
        NSLog(@"%@",[error description]);
        NSLog(@"Break");
    

    NSArray *addresses = [[dict objectForKey:@"results"] retain];

    NSDictionary *boroughs = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Bronx",@"***lyn",@"New York", @"Queens",@"Staten Island",nil] forKeys:[NSArray arrayWithObjects:@"B",@"K",@"M",@"Q",@"S", nil]];

    int i = 1;
    for(NSDictionary *file in addresses)
    
        NSString *borough = [file objectForKey:@"Borough"];
        NSString *ID = [file objectForKey:@"ID"];
        NSString *leftBound = [file objectForKey:@"LeftBound"];
        NSString *rightBound = [file objectForKey:@"RightBound"];
        NSString *sideOfStreet = [file objectForKey:@"SideOfStreet"];
        NSString *street = [file objectForKey:@"Street"];

        NSString *addressString = [NSString stringWithFormat:@"%@ and %@, %@, NY", street, rightBound, [boroughs objectForKey:borough]];
//        NSLog(@"Address string: %@",addressString);

        CLGeocoder *geocoder = [[CLGeocoder alloc] init];

        [geocoder geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *anError)
        
            NSLog(@"AAAAAAAAAAAAAAAAAAAAAAAA");
            NSLog(@"Placemark count:%d",[placemarks count]);

            for(CLPlacemark *placemark in placemarks)
            
                NSLog(@"Placemark: %@",placemark);
            

            if(anError)
            
                NSLog(@"Error: %@",[error description]);
            
        ];

        [geocoder release];
        NSLog(@"%d",i++);
    
    [parser release];
    [addresses release];

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    return YES;


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

        if([keyPath isEqualToString:@"geocoder"])
        
            NSLog(@"AAAAAAA");
        


@end

【问题讨论】:

【参考方案1】:

您确定您的“地理编码器”实例不为零吗? 如果您向“nil”对象发送消息,则不会发生任何事情... :)

NSLog(@"%@",geocoder);

【讨论】:

不好意思,确保您有互联网连接?确保您没有尝试使用相同的地理编码器发起另一个正向或反向地理编码请求,请尝试使用 Apple 的示例 addressString "1 Infinite Loop, Cupertino, CA"... 出于兴趣,您可以使用 KVO 来检测地理编码器的“isGeocoding”属性的变化吗? NSLog() 来查看它是否/何时发生... 没有“观察到变化”这样的运气,或者“观察到变化,但仍然没有调用块”这样的运气?这是一个非常奇怪的! 哇!严重地?好吧,我认为它不需要视图控制器,因为它不与视图交互。好的,您肯定已经导入了 CoreLocation 框架?模拟器还是设备? 这可能是一个很长的镜头,但是您是否尝试过设置模拟器位置?调试菜单 > 位置 > Apple?我知道我们实际上并没有使用您的位置,但由于 CLGeocoder 向前和向后工作,如果它无法获取位置数据,它可能会卡住......【参考方案2】:

我仍然不确定发生了什么。我在模拟器上运行了以下代码(原始代码减去 JSON 操作),它运行良好。也许您需要全新安装 Xcode 和 ios 模拟器?

@implementation AppDelegate

@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    NSString *addressString = [NSString stringWithFormat:@"1 Infinite Loop, Cupertino, CA"];

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    [geocoder geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *anError)
     
         NSLog(@"AAAAAAAAAAAAAAAAAAAAAAAA");
         NSLog(@"Placemark count:%d",[placemarks count]);

         for(CLPlacemark *placemark in placemarks)
         
             NSLog(@"Placemark: %@",placemark);
         

         if(anError)
         
             NSLog(@"Error: %@",[anError description]);
         
     ];

    [geocoder release];

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    return YES;


@end

输出是:

2011-12-21 18:56:30.311 Test[44445:f803] AAAAAAAAAAAAAAAAAAAAAAAA
2011-12-21 18:56:30.312 Test[44445:f803] Placemark count:1
2011-12-21 18:56:30.314 Test[44445:f803] Placemark: 1 Infinite Loop, Cupertino, CA  95014-2083, United States @ <+37.33168400,-122.03075800> +/- 100.00m, region (identifier <+37.33168400,-122.03075800> radius 71.01) <+37.33168400,-122.03075800> radius 71.01m

我能想到的唯一一件事是您可能过早地发布了您的地理编码器!也许尝试将版本移动到块中?这样,您将知道地理编码器仅在完成地理编码操作后才被释放一次。

此外,您在块内的错误处理中犯了一个错误。 应该是NSLog(@"Error: %@",[anError description]); 而不是NSLog(@"Error: %@",[error description]);

另外,请确保您没有使用 ARC...

【讨论】:

尝试卸载并重新安装 XCode,但没有成功。不使用ARC,包括Core Location等,还是没有运气。【参考方案3】:

我知道这是一个老问题,但它不起作用的原因是您不能同时发出多个转发请求。在发送另一个之前,您必须检查属性 isGeocoding。

【讨论】:

以上是关于iOS 转发地理编码块未执行的主要内容,如果未能解决你的问题,请参考以下文章

CLGeocoder 转发地理编码邮政编码

转发地理编码和缩放以适应多个位置

如何在没有来自脚本的 Internet 连接的情况下在 Python 中转发地理编码?

iOS 地理编码 / 反地理编码

iOS 原生地图地理编码与反地理编码

iOS 地理和反地理编码