在iOS中链接异步操作

时间:2015-07-31 00:16:02

标签: ios recursion afnetworking

我正在尝试修复一个从Google的网址下载记录的应用,其中包含79条记录。我的应用程序加载前70,然后意外停止。

我继承了具有loadLatLong方法的代码,该方法通过GET向URL发出AFHTTPRequestOperationManager请求,然后等待success:块处理程序中的回调

对我来说看起来不正确的部分是这样的:当success:回调到来时,块再次调用loadLatLong方法,这会使计数器前进,并发送具有相同块的另一个块。这将继续,直到所有部件都已加载。不幸的是,这个过程很早就停止了,这让我觉得这种链接请求的方式有问题。

这种处理来自URL的GET调用序列是否合适,我的错误在其他地方?是否有更好的链接异步调用的方法?

以下是代码:

- (void)loadLatLong {
    indx++;
    if (indx == [datalist count]) {
        [self showMarker];
        [self.progressbar setProgress:1.0 animated:YES];
        return;
    }
    PointClass *pt = datalist[indx];
    NSString *stPt = [pt.Location stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *str = [stPt stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    NSString *url = [NSString stringWithFormat:@"https://maps.google.com/maps/api/geocode/json?address=%@&sensor=false&key=<API KEY>", str];

    NSURL *urlString = [NSURL URLWithString:url];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
    [manager GET:[urlString absoluteString ]parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSArray *response = [responseObject objectForKey:@"results"];
        if (response.count == 0) return;
        NSDictionary *geo = [response[0] objectForKey:@"geometry"];
        NSDictionary *location = [geo objectForKey:@"location"];

        pt.lat = [[location objectForKey:@"lat"] doubleValue];
        pt.lng = [[location objectForKey:@"lng"] doubleValue];
        datalist[indx] = pt;
        NSLog([NSString stringWithFormat:@"%%d \n"], indx);

        // Calling the method that started the call again
        [self loadLatLong];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error");
    }];
}

1 个答案:

答案 0 :(得分:1)

虽然代码看起来是递归的,但递归并不存在。当[self loadLatLong]异步调用完成块时,对AFHTTPRequestOperationManager的调用发生在不同的上下文中。此时调用已启动请求的loadLatLong方法将不在调用堆栈中,因此调用不是递归的。

代码在加载所有记录之前停止的原因是此错误检查行:

if (response.count == 0) return;

看起来第70个回复没有数据 - 也许是因为谷歌在datalist[70]没有记录。此时,代码将response.count视为零,并且在不调用[self loadLatLong]的情况下返回。

您可以将if (response.count == 0) return;替换为

来解决此问题
if (response.count == 0) {
    [self loadLatLong];
    return;
}