前言
iOS7以前,iOS的网络请求一般是通过NSURLConnection sendSynchronousRequest
来处理,但是iOS7之后,NSURLConnection
已经被苹果废除了,取而代之的是NSURLSession
,而NSURLSession
并没有提供像sendSynchronousRequest
这种同步请求方法,那么如果实际项目中需要用到同步请求,要怎样解决呢?
解决方案
下面是我的一个解决方案,就是使用GDC信号量。
主角semaphore
dispatch_semaphore_create 创建一个semaphore对象
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
dispatch_semaphore_create需要传入一个整型值作为参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1。
原理
1️⃣我们创建一个semaphore对象,总信号量设置为0,如:dispatch_semaphore_create(0);
2️⃣在异步执行的方法结尾为第一步创建的semaphore对象发一个信号,使它的总信号量加一,如:dispatch_semaphore_signal(semaphore);
3️⃣在需要阻塞的地方加上dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER),DISPATCH_TIME_FOREVER的意思是如果semaphore的信号量一直是0的话,就一直等下去。
相关代码
|
|