同步AFNetworking请求
来源:互联网 发布:mallat小波分解算法 编辑:程序博客网 时间:2024/04/30 04:51
原文地址:http://xiangwangfeng.com/2014/11/29/NSURLProtocol%E5%92%8CNSRunLoop%E7%9A%84%E9%82%A3%E4%BA%9B%E5%9D%91/
虽然Mattt各种鄙视同步做网络请求,但是我们不可否认某些场景下使用同步调用会带来不少便利。一种比较简单的实现是使用信号量做同步:
@implementation AFHTTPRequestOperation (YX)- (void)yxStartSynchronous{ dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [self setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { dispatch_semaphore_signal(semaphore); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { dispatch_semaphore_signal(semaphore); }]; [self start]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);}@end
但是这样带来的问题是在UI线程调用同步请求就会导致线程堵死崩溃(好吧,就不应该允许UI线程上这么做)。一种改进的方法是使用NSRunLoop
即:
while (_shouldBlock) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; }
但是这种写法是有大坑的:如果当前NSRunLoop并没有任何NSTimer或Input Source,runMode:beforeDate:方法将立刻返回NO,于是造成死循环,占用大量CPU,进而导致NSURLConnection请求超时。 规避的方法是往RunLoop中添加NSTimer或者空NSPort使得NSRunLoop挂起而不占用CPU。(ASIHttpRequest就是在当前RunLoop中添加了0.25秒触发一次的刷新Timer)
结语:个人建议,既然你的应用工程选用AF作为网络请求的,最好不要去没事搞神马同步请求
0 0
- 同步AFNetworking请求
- AFNetWorking 同步异步请求
- AFNetworking同步请求数据
- AFNetworking 同步、异步请求,ios原生支持同步请求
- AFNetWorking 的同步,异步请求方法
- AFNetworking等待网络请求,继续同步操作
- AFNetWorking 同步调用
- AFNetWorking同步方法
- AFNetworking json请求
- AFNetWorking发送post请求
- 封装网络请求(AFNetworking)
- AFNetworking Post请求使用
- AFNetworking Get请求使用
- AFNetWorking封装请求数据
- 网络请求工具--AFNetworking
- AFNetWorking 请求携带cookie
- AFNetworking数据请求
- AFNetworking post请求
- 作为一项技艺的管理——Leo鉴书81
- 建议的程序员学习LDA算法的步骤
- TFS服务端IP更改
- C/C++ 获得公网ip地址和内网ip
- Google 2013年最具影响力的技术论文
- 同步AFNetworking请求
- 静态路由,NAT和代理服务器/ALG
- 13Saving Files(保存文件到手机内存和外存储设备上)
- 2013.9月,百度电话面试经验
- OJ题——犯“m”的灯
- 无向网图的最小生成树算法--克鲁斯卡尔算法
- How to get to the point quickly?
- Web.config配置文件详解(新手必看)
- Servlet之Request对象