参考文章
数据请求时的数据回调
背景
我们习惯把数据请求部分分离,使viewController没那么冗杂,下图中的[调用方法请求数据部分]就写在viewController里,而[数据请求部分]写在分开的文件里,我们起名为manger(就是一个普通的继承与NSObject的类,主要也是为了分离数据请求部分)。
数据请求dataTask会开启一个新线程异步执行数据请求任务,所以数据请求要得到的数据在用时需要格外谨慎,因为可能异步的数据请求任务还没有执行完,就对数据的结果进行操作,就会造成程序崩溃。
关于数据请求的实现方式:网络请求dataTask会开启新线程。通过[dataTask resume]执行网络请求任务,请求到数据后进入completionHandler(完成处理器),这也就是我们一般在下面第二张图的34行之后写回到主线程进行操作的原因,因为在这之后数据必然已经请求到了。关于同步异步可以参考我的博客 GCD
而因为我们manger类的加入,数据请求与viewController分离,所以不能在manger中操作完成后回到主线程,所以此时block的功能就派上用场。
block传值
调用方法请求数据部分
数据请求部分
我感觉block是实现和调用分离,定义部分实现block的任务,回调的时候才执行任务,所以整个过程就是:
图一PLDailySharingManger类实现postData方法,传入参数是一个block
图二在图一的调用下实现postData方法,数据请求完成后34行result(model)实现block回调,也就是数据请求完成后,回调执行图一的block中的方法(在这个例子中是使用数据请求到的结果),完成后更新tableView。此时使用数据请求的结果,数据请求必然已经完成,所以不会造成程序崩溃。