您的位置:首页 > 理论基础 > 计算机网络

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:的参数是[NSOperationQueue
mainQueue]。

举一个平常咱们经常会看到的例子:你在用这一类app看新闻或者刷贴吧的时候,有没有注意到经常我们滑动到下面的视图,上面的图片并没有全部都显示上去,而是过一会,图片就自动出现了。这就是异步的效果,如果是同步请求,不等到图片被请求下来,你的界面只会卡在哪里,你什么也干不了,是不是很反人类?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 网络编程 ios开发