一、同步请求
在网络编程第二篇,咱们写的get,post请求使用的都是同步请求,那结合同步异步、get/post组合在一起,有同步get、同步post、异步get、异步post。大多数情况下出于性能和用户交互上的体验的考虑,用的是异步post或者异步get,具体是post还是get看服务器是否有明确要求。如果对上一章的代码有不熟悉或者需要回忆的地方,可以通过下面链接,去重温一下:
在运行第二篇文章的工程时,如果没有网络因素的干扰,大家可以感受到进入项目的时间偏长。因为根视图控制器在viewdidload:里面,需要发送网络请求,由于是同步请求,所以如果没有拿到服务器数据之前,我们是看不到根视图控制器的,这还仅仅是发送了一次同步请求。试想一下,类似于网易新闻,主页面是一个tableView,每次滑动tableView,上拉加载更多的时候,是不是得卡成一副死样。罪魁祸首就是[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];这段代码,英语不好的同学可以查一下Synchronous是什么意思。(同步的,同时的)
既然大家知道这是同步,那NSURLConnection肯定还有一个异步发送请求的方法咯。
二、异步请求
下面咱们可以依旧用上一次的代码,只不过把同步改成异步,鉴于get请求省去了很多麻烦,那我就把麻烦留给自己吧,写一个post的异步请求,大家改成get请求只需要稍稍修改一下request的创建就好了(还是要记得修改iOS9的网络适配):
三、总结
主要区别还是在3.发送请求这里,sendAsynchronousRequest:有几个参数,第一个请求不需要介绍了,第二个是线程,前面说过这里会涉及到线程相关知识,只需要记住这里只用在主线程就可以了(一般接收到数据后回到主线程,有些时候还是按需求而定),然后就是后面的block,通过回调获得请求的数据。这就是为什么它能够做到异步。粗略的理解就是,用户的点击操作都是在主线程完成的,如果你在主线程里发送网络请求,获取服务器响应,那么用户的操作就会被阻塞,使得应用就跟死了一样,不会接收到用户的任何操作。异步发送请求,会将网络请求响应这一块放到一个新的线程,用户还是可以该做什么做什么,互不干扰,当获取到服务器数据,就需要回到主线程,来显示和处理这些数据,这也是为什么queue:的参数是[NSOperationQueue mainQueue]。
举一个平常咱们经常会看到的例子:你在用这一类app看新闻或者刷贴吧的时候,有没有注意到经常我们滑动到下面的视图,上面的图片并没有全部都显示上去,而是过一会,图片就自动出现了。这就是异步的效果,如果是同步请求,不等到图片被请求下来,你的界面只会卡在哪里,你什么也干不了,是不是很反人类?