当前位置: 主页 > 赛马会单双资料 >

赛马会单双资料

老司机出品————多线程实践www-737321.com

发布时间:2019-11-14

  老司机今天讲的不是多线程的基本用法,这个东西往上的博客其实蛮多的,而且也基本是多线程的基本用法。老司机今天主要的是介绍多个异步线程执行结束后进行回调的解决方案,如果说这么说不太清楚的话,

  其实这个需求呢,还是挺常见的。主要呢,目前有两种解决思路,一种呢是GCD中的dispatch_group,一种是NSOperation。

  第二个解决方案就是使用NSOperation。呐,我会放在第二节着重介绍一下的。

  我们知道,NSOperation是苹果提供的一套面向对象的基于GCD封装的多线程解决方案。他在使用上更加符合面向对象的思想,更加方便的为任务添加依赖关系,同时提供了四个支持KVO监听的代表当前任务执行状态的属性cancelled、executing、finished、ready。NSOperation内部对这四个状态行为作了预处理,根据任务的不同状态这四个属性的值会自动改变。当NSOperation配合NSOperationQueue使用时,Queue会监听所有Operation的状态从而分配任务的启动时机。总之,NSOperation隐藏了很多内部细节,让我们开发者无需关心任务的各种状态。

  首先,为了模仿系统行为,我们先观察下系统的NSOperation的cancelled、executing、finished、ready四个属性的状态变化情况。那我们去监听一下NSOperation的四个属性。代码如下:

  上述代码中,我们监听了四个属性并执行了Operation。根据日志我们可以总结如下:

  我们再看一下如果在执行 -start 之前先执行 -cancel 后会是什么状态:

  单个Operation的行为我们已经基本了解,那么接下来我们来看一下当两个Operation添加到Queue中会是什么结果。

  我们再来看看当bp1添加bp2作为依赖,并且在调用之前bp2调用 -cancel 时的状态变化,代码基本一致,唯一变化是在添加在q之前bp2调用 -cancel,我就不放代码了,直接看日志输出:

  通过观察上述的日志我们可以看出,当一个任务作为另一个任务的依赖时,只有当被依赖的任务完成后,才会执行另一个任务,而这个时间点的时候,executing、finished两个属性会发生变化。那我们需要做的就是实现一个NSOperation的子类,让他可以再我们需要的时候才被标记为完成状态,这样,我们只要给刷新列表任务添加网络请求任务作为依赖即可。所以,我们需要做的只有两件事,就是接过executing、finished两个属性的管理权以及在我们需要的时候改变他们的状态。

  呐,写到这里,我们就基本实现了一个跟系统Operation具有相同行为,但是我们可以随意控制Operation是否完成的子类了。

  不知道该叫什么我就随便起了个名,其实就是一个应用,场景就是操作A一定要建立在某种状态下才能执行。最简单的就是比如点赞功能必须是登录后才可进行,那么我们就要对这种状态做出判断。如下图:

  你可能说这无非就是一个判断的事,的确是,不过像登录状态这种很多地方都要用的功能这样写也能很好的复用。这个思路能主要还是借鉴的大神Delpan的这篇博客:《操作抽象设计-实践》,写的很好,同学们感兴趣可以去看看。

  呐,写到这里其实就只是讲思路了,至此我们已经具有了一个可以控制完成时机的Operation了,www-737321.com,只要我们将网络请求与Operation同时 -start 后,请求回调结束后标志Operation为完成状态后就可以为请求添加依赖了,同时也可以配合系统的其他Operation和Queue同时使用完成线程间通信。

  说到这要是就结束了那就太虎头蛇尾了,而且真爱粉们应该知道,一般到这个时候就是老司机的软广环节了,着急的童鞋们可以关掉浏览器了哈~

  老司机给予这个思路对AFN进行了二次封装,写了一个自用的请求框架DWFlashFlow。

  首先它具有NSOperation的所有特性,可以跟普通Operation结合在一起使用,其次我还封装了批量请求和请求量功能,并且在功能层和逻辑层上进行了分离,也就是说你可以自由更换你的请求核心类,而逻辑层不变~哎,最近都不会吹牛逼了,剩下的东西喜欢的同学自己看吧~



友情链接:

静心阁,559955.com,赛马会,赛马会总部,赛马会单双资料,54.hk赛马会,港彩赛马会免费资料,香港赛马会唯一官方网。

正版挂牌| 天线宝宝论坛| 开奖直播| 天空网| www.41ok.com| 诸葛亮心水| www.84498.net| 黄大仙论坛| 九龙彩色图库| 香港六合彩网址| www.21108.com| 现场直播|