NSURLSession 同步请求(使用信号量)
2016-05-30 14:30
232 查看
iOS9以后苹果建议废除NSURLConnection,使用NSURLSession来代替NSURLConnection。但是NSURLSession只有异步请求,如果想用同步请求的话我的方法是使用信号量(使用信号量的缺点是会卡线程)。不过更好的方法是用回调,这里讲的方法是用信号量。
先简单介绍一下信号量:
信号量是一个整型值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。
在GCD中有三个函数是semaphore的操作,分别是:
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
简单的介绍一下这三个函数,第一个函数有一个整型的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。
关于信号量我参考了http://blog.csdn.net/fhbystudy/article/details/25918451这篇文章。
最后写上我自己的一个小Demo:
先简单介绍一下信号量:
信号量是一个整型值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。
在GCD中有三个函数是semaphore的操作,分别是:
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
简单的介绍一下这三个函数,第一个函数有一个整型的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。
关于信号量我参考了http://blog.csdn.net/fhbystudy/article/details/25918451这篇文章。
最后写上我自己的一个小Demo:
- (IBAction)postClick:(id)sender { dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //创建信号量 NSURL *url = [NSURL URLWithString:@"http://192.168.1.104/Login/userLogin.php"]; //2.构造Request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //(1)设置为POST请求 [request setHTTPMethod:@"POST"]; //(2)超时 [request setTimeoutInterval:60]; //(3)设置请求头 //[request setAllHTTPHeaderFields:nil]; //(4)设置请求体 NSString *bodyStr = @"user_name=admin&user_password=admin"; NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; //设置请求体 [request setHTTPBody:bodyData]; //3.构造Session NSURLSession *session = [NSURLSession sharedSession]; //4.task NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; NSLog(@"dict:%@",dict); dispatch_semaphore_signal(semaphore); //发送信号 }]; [task resume]; dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER); //等待 NSLog(@"数据加载完成!"); }
相关文章推荐
- 242. Valid Anagram
- [C/C++11]_[初级]_[实用时间库chrono]
- 基于webpack使用ES6新特性(转载)
- js取整、取余等常用方法
- WebView内存泄漏记录
- 栈、队列和链表
- Android常用控件之ListView(二)
- 用setAnimationStyle来设置popwindow显示消失的动画效果
- Bootstrap+jfinal退出系统弹出确认框的实现方法
- return和finally的执行和联系
- iOS CGColorGetComponents
- nginx 平滑重启
- 在SublimeText上搭建ReactJS开发环境(转载)
- Qt浅谈之十三:抓图截屏
- 2016春季练习——DP水题
- RadioButton去掉默认样式小圆点
- iOS中日期和字符串的相互转化(时间戳)
- 90---Hibernate使用方法-----------使用注解完成Hibernate映射
- DrawerLayout+NavigationView打造Google原生Material Design风格侧滑菜单
- 第三章:多态