我正在尝试找出使用AFNetworking 2.0对大量GET请求进行分组或批处理的最佳做法。所有GET请求都需要在代码可以继续之前完成,但它们不必一个接一个地运行。现在对于单个请求,我正在使用AFHTTPRequestOperationManager
(另请参见此处:Subclass AFHTTPRequestOperationManager?)。
此处描述了一种可能性,使用dispatch_group:How to batch request with AFNetworking 2?,但这适用于AFHTTPSessionManager
,仅适用于iOS7。我的应用程序仍然以iOS6为目标,因此我需要使用AFHTTPRequestOperationManager
。
是否正在使用dispatch_group?或者AFNetworking中是否存在我忽略并可以用于此的内容?
编辑:仍然不知道正确的方法是什么......例如,如何使用AFHTTPRequestOperation
组?
我尝试了以下内容,但在所有回复进入之前,最终会显示最终的NSLog(“完成搜索”):
dispatch_queue_t dispatch_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t dispatch_group = dispatch_group_create();
for (Entry *e in self.entries)
{
dispatch_group_async(dispatch_group, dispatch_queue, ^{
NSString *queryString = [e getQueryString];
NSURL *URL = [NSURL URLWithString: queryString];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFHTTPResponseSerializer serializer];
operation.completionGroup = dispatch_group;
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", responseObject);
} failure:nil];
[operation start];
});
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"done searching");
});
答案 0 :(得分:11)
经过多次尝试后,我想出了以下内容,这正是我所需要的。所有AFHTTPRequestOperation
调用都由单身客户端处理:
dispatch_group_t dispatchGroup = dispatch_group_create();
for (Entry *e in self.entries)
{
dispatch_group_enter(dispatchGroup);
MyDBClient *dbClient = [MyDBClient sharedClient];
[dbClient searchForQuery: queryString
withParameters: nil
completion: ^(NSData *data, NSError *error) {
if (data) {
// process data
}
else {
// deal with error, if any
}
dispatch_group_leave(dispatchGroup);
}];
}
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{
// update UI here
});
客户端中的代码基于我在此处找到的示例代码:http://nsscreencast.com/episodes/91-afnetworking-2-0
我希望这可以帮助那些努力实现同样目标的人。