Блок прямого геокодирования iOS не выполняется - PullRequest
4 голосов
/ 18 декабря 2011

Почему этот блок кода не выполняется? Я скопировал и вставил его из другого моего проекта, где он работает просто отлично. Я также попробовал это в моем другом приложении с тем же 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",@"Brooklyn",@"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

Ответы [ 3 ]

1 голос
/ 18 декабря 2011

Вы убедились, что ваш экземпляр "геокодера" не ноль?
Ничего не произойдет, если вы отправите сообщение объекту "nil" ...:)

NSLog(@"%@",geocoder);
0 голосов
/ 15 января 2014

Я знаю, что это старый вопрос, но причина этого не в том, что вы не можете сделать несколько запросов вперед одновременно. Вы должны проверить свойство isGeocoding перед отправкой другого.

0 голосов
/ 21 декабря 2011

Я все еще не уверен, что происходит.Я запустил следующий код (исходный код без операций JSON) на моем симуляторе, и он работал отлично.Может быть, вам нужна новая установка Xcode & iOS Simulator?

@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 ...

...