优雅地解决网络请求的依赖关系
解决网络时,经常会遇到网络请求相互依赖的情况,如B请求的参数依赖A请求的回调结果,直接在A请求的回调中请求B,会导致回调嵌套,这样导致请求之间紧张耦合。这里详情一个较优雅的方法:利用NSOperation的操作依赖。
- 本例尝试下载两张图片,假设图片2总是在图片1显示后再显示。
- 下载框架选用AFNetworking3
要使用NSOperation的操作依赖首先需要一个NSOperationQueue:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];queue.name = @"SessionQueue";
因为AFNetworking3中的AFHTTPSessionManager不是NSOperation的子类,这与AFNetworking2有很大不同,不能直接加入NSOperationQueue
,需要封装一下,幸运的是已经有第三方库已经做了所有工作,先引入库:
pod 'AFSessionOperation', :git => ' robertmryan/AFHTTPSessionOperation.git'
AFHTTPSessionOperation
是 NSOperation
的子类,同时调用AFNetworking实现了HTTP 请求,下面是请求操作的实现:
NSString *imangeUrl1 = @"https://upload-images.jianshu.io/upload_images/2025746-368aa3a508d2fbac.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240";NSString *imangeUrl2 = @"https://upload-images.jianshu.io/upload_images/2025746-27bbf45bea40162c.JPEG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240";NSOperation *op1 = [AFHTTPSessionOperation operationWithManager:manager HTTPMethod:@"GET" URLString:imangeUrl1 parameters:nil uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"finished 1"); UIImage *image = [UIImage imageWithData:responseObject]; _imageView1.image = image;} failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failed 1 - error = %@", error.localizedDescription);}];NSOperation *op2 = [AFHTTPSessionOperation operationWithManager:manager HTTPMethod:@"GET" URLString:imangeUrl2 parameters:nil uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"finished 2"); UIImage *image = [UIImage imageWithData:responseObject]; _imageView2.image = image;} failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"failed 2 - error = %@", error.localizedDescription);}];
op2依赖op1:
[op2 addDependency:op1];
最后将op1、op2增加到操作队列中,这会开始执行网络请求:
[queue addOperations:@[op1, op2] waitUntilFinished:false];
执行结果:
模拟器截图
控制台输出
按照我们的设计,op2在op1完成后才执行。
使用时注意不要造成依赖环
,像这样:
[op1 addDependency:op2];[op2 addDependency:op1];
这样两个操作都不会执行。
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 优雅地解决网络请求的依赖关系
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 优雅地解决网络请求的依赖关系