我正在尝试修复一个从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");
}];
}
答案 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;
}