iOS开发之网络编程:同步,异步请求差异及用法
2016-04-09 09:17
621 查看
一、同步请求
在网络编程第二篇,咱们写的get,post请求使用的都是同步请求,那结合同步异步、get/post组合在一起,有同步get、同步post、异步get、异步post。大多数情况下出于性能和用户交互上的体验的考虑,用的是异步post或者异步get,具体是post还是get看服务器是否有明确要求。如果对上一章的代码有不熟悉或者需要回忆的地方,可以通过下面链接,去重温一下:Get,Post请求差异及用法
在运行第二篇文章的工程时,如果没有网络因素的干扰,大家可以感受到进入项目的时间偏长。因为根视图控制器在viewdidload:里面,需要发送网络请求,由于是同步请求,所以如果没有拿到服务器数据之前,我们是看不到根视图控制器的,这还仅仅是发送了一次同步请求。试想一下,类似于网易新闻,主页面是一个tableView,每次滑动tableView,上拉加载更多的时候,是不是得卡成一副死样。罪魁祸首就是[NSURLConnection sendSynchronousRequest:request
returningResponse:&response error:&error];这段代码,英语不好的同学可以查一下Synchronous是什么意思。(同步的,同时的)
既然大家知道这是同步,那NSURLConnection肯定还有一个异步发送请求的方法咯。
二、异步请求
下面咱们可以依旧用上一次的代码,只不过把同步改成异步,鉴于get请求省去了很多麻烦,那我就把麻烦留给自己吧,写一个post的异步请求,大家改成get请求只需要稍稍修改一下request的创建就好了(还是要记得修改iOS9的网络适配):#pragma mark - post异步请求
// 1.获取请求网址
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?"];
// 2.封装请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; // post
// 设置请求方式
[request setHTTPMethod:@"POST"];
// 设置请求体(会把请求的数据转成data,达到用户信息保密的目的)
NSData *data = [@"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213" dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
// 3.发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSError *newError = nil;
// 获取数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&newError];
NSArray *array = dict[@"news"];
NSDictionary *dic = array[0];
NSLog(@"%@", dic[@"title"]);
}];
三、总结
主要区别还是在3.发送请求这里,sendAsynchronousRequest:有几个参数,第一个请求不需要介绍了,第二个是线程,前面说过这里会涉及到线程相关知识,只需要记住这里只用在主线程就可以了(一般接收到数据后回到主线程,有些时候还是按需求而定),然后就是后面的block,通过回调获得请求的数据。这就是为什么它能够做到异步。粗略的理解就是,用户的点击操作都是在主线程完成的,如果你在主线程里发送网络请求,获取服务器响应,那么用户的操作就会被阻塞,使得应用就跟死了一样,不会接收到用户的任何操作。异步发送请求,会将网络请求响应这一块放到一个新的线程,用户还是可以该做什么做什么,互不干扰,当获取到服务器数据,就需要回到主线程,来显示和处理这些数据,这也是为什么queue:的参数是[NSOperationQueuemainQueue]。
举一个平常咱们经常会看到的例子:你在用这一类app看新闻或者刷贴吧的时候,有没有注意到经常我们滑动到下面的视图,上面的图片并没有全部都显示上去,而是过一会,图片就自动出现了。这就是异步的效果,如果是同步请求,不等到图片被请求下来,你的界面只会卡在哪里,你什么也干不了,是不是很反人类?
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Lua下基本的网络编程示例
- linux网络编程用到的网络函数详解用和使用示例
- C#网络编程基础之进程和线程详解
- C++ 网络编程 总结
- Linux网络编程之UDP Socket程序示例
- Android网络编程之UDP通信模型实例
- 谈谈新手如何学习PHP网络编程第1/2页
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现