AFNetworking 3.0 AFHTTPSessionManager使用NSOperation

我有一段时间卡住了,我需要帮助。 所以在AFNetworking 2.0我们有AFHTTPRequestOperation所以我可以很容易地使用NSOperationQueue并有一些依赖。 所以现在我们只有AFHTTPSessionManagerNSURLSession没有NSOperation子类。 我有类APIClient子类。 我正在使用该类作为sharedClient单例。 我已经覆盖GET和POST,所以例如GET看起来这样:

 - (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(NSDictionary *)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { NSURLSessionDataTask *task = [super GET:URLString parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { success(task, responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(task, [Response createErrorWithAFNetworkingError:error]); }]; return task; } 

你有任何想法如何实现这种方式(如果可能的话)包装为NSOperation ? 所以我想要做的 – 我想能够并行运行两个networking调用,然后有另一个方法调用,这依赖于前两个调用的第二个networking调用。 你有什么想法什么是最好的办法?

我已经写了一组快速的类( https://github.com/robertmryan/AFHTTPSessionOperation/ ),在asynchronousNSOperation子类中包装AFHTTPSessionManager请求。 然后,您可以使用它来享受maxConcurrentOperation约束或操作依赖关系。

例如,下面是一个例子,我们发出两个并发请求,并有一个完成操作依赖于这两个请求的完成:

 // ViewController.m #import "ViewController.h" #import "AFNetworking.h" #import "AFHTTPSessionOperation.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *urlString1 = @"..."; NSString *urlString2 = @"..."; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; queue.name = @"AFHTTPSessionManager queue"; NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"All done"); }]; NSOperation *op1 = [AFHTTPSessionOperation operationWithManager:manager HTTPMethod:@"GET" URLString:urlString1 parameters:nil uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"finished 1"); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failed 1 - error = %@", error.localizedDescription); }]; [completionOperation addDependency:op1]; NSOperation *op2 = [AFHTTPSessionOperation operationWithManager:manager HTTPMethod:@"GET" URLString:urlString2 parameters:nil uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"finished 2"); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failed 2 - error = %@", error.localizedDescription); }]; [completionOperation addDependency:op2]; [queue addOperations:@[op1, op2] waitUntilFinished:false]; [[NSOperationQueue mainQueue] addOperation:completionOperation]; // do this on whatever queue you want, but often you're updating UI or model objects, in which case you'd use the main queue } @end 

值得注意的是,既然你只处理两个请求,你也可以使用调度组来完成同样的事情:

 // ViewController.m #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *urlString1 = @"..."; NSString *urlString2 = @"..."; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); [manager GET:urlString1 parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"finished 1"); dispatch_group_leave(group); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"failed 1 - error = %@", error.localizedDescription); dispatch_group_leave(group); }]; dispatch_group_enter(group); [manager GET:urlString2 parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"finished 2"); dispatch_group_leave(group); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"failed 2 - error = %@", error.localizedDescription); dispatch_group_leave(group); }]; dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"All done"); }); } @end 

使用调度组,只需要注意successfailure块中的每个path都调用dispatch_group_leave