2013-07-01 3 views
1

Я использую API геокодирования Google и API-интерфейс расстояния в асинхронном потоке в моем приложении. Но он выдаёт исключение NSRangeException. Вот мой код:NSRangeException за пределами границ после вызова JSON

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^ 
{ 
    NSString *urlStringGeoCoding; 
    NSString *urlString; 

    urlStringGeoCoding = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/" 
                @"api/geocode/json?" 
                @"latlng=40.714224,-73.961452&sensor=true"]; 

    urlString = [NSString stringWithFormat:@"http://maps.googleapis.com" 
              @"/maps/api/distancematrix/json?" 
              @"origins=%@&destinations=%@&mode=driving&" 
              @"language=en&sensor=true&units=imperial"," 
              @"current,@"Chicago,IL"]; 

    NSURL *urlGeo = [NSURL URLWithString:[urlStringGeoCoding 
          stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSURL *url = [NSURL URLWithString:[urlString 
          stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSData *googledatageo = [NSData dataWithContentsOfURL:urlGeo]; 
    NSData *googledata = [NSData dataWithContentsOfURL:url]; 
    NSError *errorgeo; 
    NSError *error; 

    NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:googledata 
                   options:kNilOptions 
                    error:&error]; 
    NSMutableDictionary *jsongeo = [NSJSONSerialization JSONObjectWithData:googledatageo 
                    options:kNilOptions 
                    error:&errorgeo]; 

    NSString *result = [[[[[[json objectForKey:@"rows"] objectAtIndex: 0] objectForKey:@"elements"] objectAtIndex:0]objectForKey:@"distance"]objectForKey:@"text"]; 
    if(jsongeo) 
    { 
     NSString *resultgeo = [[[jsongeo objectForKey:@"results"] objectAtIndex: 0] objectForKey:@"formatted_address"] ; 
    } 

    dispatch_sync(dispatch_get_main_queue(),^
    {  
     cell.distanceLabel.text = result; 
    }); 
}); 

Вот ошибка я получаю: Нагрузочное приложение из-за неперехваченное исключение 'NSRangeException', причина: '* - [__ NSArrayI objectAtIndex]: индекс 0 за границами для пустого массива' * Первый стек бросить вызов: (0x289a012 0x2210e7e 0x284fb44 0x1318c 0x57f953f 0x580b014 0x57fc2e8 0x57fc450 0x9112ae72 0x91112d2a)

Как предотвратить Range Exception здесь?

+0

Пожалуйста, отформатируйте код, который вы публикуете, используйте отступ и т. Д. –

+0

Три раза вы делаете 'objectAtIndex: 0', размещаете точку останова и печатаете' json' и 'jsongeo' и рассказываете, что вы видите. Вероятно, это будет один из них. –

ответ

1

Вы предотвратить эти исключения диапазона, проверяя count из "rows", "elements" и "results" массивов, перед вызовом objectAtIndex: на них.

Было бы неплохо разбить эти две очень длинные линии, которые в любом случае назначают и resultgeo; просто используйте несколько временных переменных NSArray.

+1

Спасибо. –

Смежные вопросы