WWDC 2015 - Session 226 - Advanc

作者: NinthDay | 来源:发表于2016-03-17 21:45 被阅读249次

    演讲者:
    Philippe Hausler - Foundation Engineer
    Dave DeLong - Frameworks Evangelist (主讲)

    NSOperation 基础知识

    正式 Session 笔记前,补点NSOperation的基础知识。

    NSOperation 是什么?

    NSOperation:NS = NextStep 前缀简写;Operation 即操作,通俗来讲就是要做的事情,配合要处理的数据,封装成一个Operation,执行方式可以是并发方式(与并行略有不同)或非并发方式。

    NSOperation 是抽象类,因此真正要使用它并需通过subclass。Foundation框架为我们提供了 NSInvocationOperation 和 NSBlockOperation 两个子类,当然你可以自定义继承实现!

    NSOperation的几个简单操作

    前面说到NSOperation是一个操作,通过发送start消息告知执行;发送cancel消息告知正在执行的操作取消。

    // 执行
    operation.start()
    // 取消
    operation.cancel()
    

    操作执行完后还想进行一些后续处理的话,可以通过赋值 completionBlock 闭包即可:

    operation.completionBlock = {
      // 这些是一些操作
    }
    

    Session 正文笔记

    session 分三部分讲解:

    • Core Concepts
    • Beyond the Basics
    • Sample Code

    知识点一:maxConcurrentOperationCount

    • maxConcurrentOperationCount = 1
      顾名思义,最大并行操作个数为1,因此队列中的操作(NSOperation)只能是一个挨一个执行。当前仅当前一个操作成功执行完毕,后一个操作才能开始执行。

    • maxConcurrentOperationCount = Default
      这个就有点意思了,会根据系统当前资源来进行合理分配,假若资源充足,那么可能一下子执行队列中的2个操作!

    知识点二:NSOperation 生命周期

    lifecycle.png

    如上图所示具有四个阶段:

    • Pending
    • Ready
    • Executing
    • Finished

    每一个Operation实例化都处于Pending状态,之后依次 Ready -> Executing -> Finished 。当然前面说到还有个取消状态Cancelled,这个是有限制的,只有Pending、Ready和Executing时才可以进行取消,换句话说除Finished不行,其他都ok!

    cancel.png

    关于取消状态,Operation 采用了一个布尔值进行标示:

    // 注意是只读属性
    var cancelled: Bool { get }
    

    仅是改变状态,Operation的子类可根据该状态执行对应操作。或者就是简单调用operation.cancel()方法即可。

    同理Read状态也有个var ready: Bool { get }来标示。

    正如下图所示将一组处于Pending状态的Operation放入队列中:

    pending.png

    此时第四个操作状态改变了:Ready!

    ready.png

    那么对不住了,处于ready的第一个执行!其他处于pending的待命吧。

    那么假若有2个operation处于ready呢?答案是按串行方式进行执行,哪个在前执行哪个。

    Dependencies 依赖性

    说来理解也简单,“先做这个操作,后执行那个操作”,这样就严格按照了执行了顺序,而不会出现操作混乱的情况,这里主要通过readiness来实现。

    代码实例:

    let operationA = ...
    let operationB = ...
    operationB.addDependency(operationA)
    

    这样不得不提及一个重要的问题:死锁。顾名思义:就是死死锁住了,啥都干不了了。譬如现在有操作A和操作B,B增加了对A的关联:仅当A操作完成后执行B;同时A增加了对B的关联:仅当B操作执行完成后执行A。这时候A和B傻眼了,都在互相等对方完成,否则啥也不干,这就造成了死锁。

    对于操作间的依赖性问题,请勿将两个操作进行关联,否则势必造成死锁!

    之后Session主要对WWDC这个App中使用到的操作进行了讲解,太具体了也就不记录了。有兴趣地可直接去官方看视频或下demo观看。

    相关文章

      网友评论

        本文标题:WWDC 2015 - Session 226 - Advanc

        本文链接:https://www.haomeiwen.com/subject/zkmclttx.html