swift 同步 网络请求_iOS 中网络请求同步

场景

在开发过程中,有时候会遇到这样一些问题,比如:

在某些业务要求下,需发送同步请求。

在某些界面需请求多个接口,且各个接口返回的数据之间或者整体存在依赖关系。

···

那么在上述的这些场景下应如何发送网络请求?发同步请求 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值