1

我在我的应用程序的异步线程上调用 Google 的地理编码 API 和距离矩阵 API。但它发出了 NSRangeException。这是我的代码:

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 0x57fc28 0x57fc450 0x9112ae72 0x91112d2a)

如何在此处防止范围异常?

4

1 回答 1

1

在调用它们之前,您可以通过检查、和数组的count来防止这些范围异常。"rows""elements""results"objectAtIndex:

把这两条很长的行分开是个好主意,result不管怎样resultgeo;只需使用一些临时NSArray变量。

于 2013-07-01T21:25:17.493 回答