场景
在开发过程中,有时候会遇到这样一些问题,比如:
在某些业务要求下,需发送同步请求。
在某些界面需请求多个接口,且各个接口返回的数据之间或者整体存在依赖关系。
···
那么在上述的这些场景下应如何发送网络请求?发同步请求 or 异步请求?请求嵌套?······
本文将简单探究开发过程中网络请求同步的问题以及相关注意点。
NSURLConnection 中的同步请求
我们都知道 NSURLConnection 中有一个同步请求的 API :
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request
returningResponse:(NSURLResponse **)response
error:(NSError **)error
针对上述的第一种情况,该 API 可满足要求。如果同步请求阻塞主线程的时间过长,存在被 watchdog kill 的可能。想避免这种情况,建议在子线程中调用此 API。(感兴趣的同学可以看看,关于 watchdog timeout crashes/Understanding and Analyzing Application Crash Reports)
同步请求相对异步请求而言存在一些缺陷,如:
请求发出后,就无法取消
返回的数据只能放到请求结束后进行处理
···
很遗憾,NSURLConnection 目前已被苹果全面弃用,并且 AFNetworking 在 3.x 中已经移除此类 API,因此同步请求不建议采用此种方式。
Dispatch_semaphore(信号量)
信号量机制,我们可以简单理解为资源管理分配的一种抽象方式。在 GCD 中,提供了以下这么几个函数,可用于请求同步等处理,模拟同步请求:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(value);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_s