AFNetworking 3.0 AFHTTPSessionManager使用NSOperation
我有一段时间卡住了,我需要帮助。 所以在AFNetworking 2.0我们有AFHTTPRequestOperation
所以我可以很容易地使用NSOperationQueue
并有一些依赖。 所以现在我们只有AFHTTPSessionManager
和NSURLSession
没有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
使用调度组,只需要注意success
和failure
块中的每个path都调用dispatch_group_leave
。