iOS7之后的同步请求解决方案

前言

​   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的话,就一直等下去。

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//step 1:创建同步信号量
dispatch_semaphore_t semaphore=dispatch_semaphore_create(0);
//step 2:创建请求
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"get"];
[request setValue:@"iOS" forHTTPHeaderField:@"User-Agent"];
//step 3:创建urlsession实例
NSURLSession *session=[NSURLSession sharedSession];
//step 4:使用dataTaskWithRequest方法连接服务器
NSURLSessionDataTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
//这里处理错误
}
else{
//这里处理服务器返回的数据
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
------ 本文结束 ------

版权声明

yoGa's Blog by yoga lee is licensed under a Creative Commons BY-NC-ND 4.0 International License.
yoga lee创作并维护的yoGa's Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于yoGa's Bloghttp://yoga.ibye.cn ),版权所有,若需转载请注明出处,谢谢支持。