多线程:Operation和OperationQueue

栏目: IOS · 发布时间: 7年前

内容简介:打印结果:结论是:op2依赖于op1时,不管添加操作的顺序如何,结果都是op1先执行,op2再执行。FIFO:先进先出:这是队列的数据结构。
多线程:Operation和OperationQueue

生命周期

多线程:Operation和OperationQueue
//都有共同特点,只读属性。
//是否准备
open var isReady: Bool { get }
//是否执行
open var isExecuting: Bool { get }
//是否取消
open var isCancelled: Bool { get }
//是否完成
open var isFinished: Bool { get }
//操作完成之后的回调
open var completionBlock: (() -> Void)?
复制代码
  1. let operation = Operation() 此时处于Pending状态
  2. 依赖 添加完会进入Ready阶段。此时操作对象会进入 准备就绪状态
  3. 优先级 设置之后会进入执行阶段。queuePriority属性决定了 进入准备就绪状态下的操作 之间的开始执行顺序。
  4. 完成之后会finished,并且有回调。
  5. 完成之后的不能取消,取消可以在其他三个时刻。

依赖(dependency)

//添加依赖
open func addDependency(_ op: Operation)
//移除依赖
open func removeDependency(_ op: Operation)
复制代码
//1.创建队列
let queue = OperationQueue()
//2.创建操作
let op1 = BlockOperation {
    print("操作1")
}
let op2 = BlockOperation {
    print("操作2")
}
//3.添加依赖
op2.addDependency(op1)
//4.添加操作
queue.addOperation(op2)
queue.addOperation(op1)
复制代码

打印结果:

操作1
操作2
复制代码

结论是:op2依赖于op1时,不管添加操作的顺序如何,结果都是op1先执行,op2再执行。

  1. 添加依赖,改变操作顺序。 在SDWebImage中
if (sself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) {
            // Emulate LIFO execution order by systematically adding new operations as last operation's dependency
            [sself.lastAddedOperation addDependency:operation];
            sself.lastAddedOperation = operation;
        }
复制代码
typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
    /**
     * Default value. All download operations will execute in queue style (first-in-first-out).
先进先出:这是队列的数据结构
     */
    SDWebImageDownloaderFIFOExecutionOrder,

    /**
     * All download operations will execute in stack style (last-in-first-out).
后进先出:这是栈的数据结构
     */
    SDWebImageDownloaderLIFOExecutionOrder
};
复制代码

FIFO:先进先出:这是队列的数据结构。

LIFO:这是栈的数据结构。

关于这两个数据结构模型(暂且不讲),因为后进的操作依赖于新进的操作,所以后进的操作要等先进的操作出队之后在执行。

这就是根据依赖改变的队列的执行顺序。

  1. 不同队列的操作可以依赖 。顺序保存不变。
  2. 不能相互依赖,会造成操作死锁。

优先级(queuePriority)

open var queuePriority: Operation.QueuePriority 默认normal

public enum QueuePriority : Int {
        case veryLow
        case low
        case normal
        case high
        case veryHigh
    }
复制代码

NSOperation 提供了queuePriority(优先级)属性,queuePriority属性适用于同一操作队列中的操作,不适用于不同操作队列中的操作。

在SDWebImage中

if (options & SDWebImageDownloaderHighPriority) {
            operation.queuePriority = NSOperationQueuePriorityHigh;
        } else if (options & SDWebImageDownloaderLowPriority) {
            operation.queuePriority = NSOperationQueuePriorityLow;
        }
复制代码
多线程:Operation和OperationQueue

取消操作

//取消操作
open func cancel()
复制代码

waitUntilFinished()

阻塞当前线程,直到该操作结束。可用于线程执行顺序的同步。

print("begain")
        let opA = BlockOperation()
        opA.addExecutionBlock {
            print("操作A")
        }
        let opB = BlockOperation()
        opB.addExecutionBlock {
            print("操作B")
        }
        
        let queue = OperationQueue()
        queue.addOperations([opA,opB], waitUntilFinished: true)
        print("------")
        
        let opC = BlockOperation()
        opC.addExecutionBlock {
            print("操作C")
        }
        let opD = BlockOperation()
        opD.addExecutionBlock {
            print("操作D")
        }
        queue.addOperations([opC,opD], waitUntilFinished: true)
        print("end")
复制代码

打印结果

begain
操作A
操作B
------
操作C
操作D
end
复制代码

直到操作A、操作B完成之后,才能进行下面的操作

operation的实现类

因为operation是抽象类,所以使用的时候需要用子类或者继承operation的子类。

BlockOperation

let opA = BlockOperation()
        opA.addExecutionBlock {
            print("操作A")
        }
复制代码

NSInvocationOperation

swfit中已经没有这个类了,只在OC中。

继承Operation

  • 非并发:non-concurrent
main()
复制代码

必须重写main()方法

class DownLoadOperation: Operation {
    override func main() {
    print("下载了")
    }
}
复制代码
let opA = DownLoadOperation()
    let queue = OperationQueue()
    queue.addOperations([opA], waitUntilFinished: true)
复制代码
  • 并发:concurrent
start()

isAsynchronous

isExecuting

isFinished
复制代码

至少这几个属性和方法重写

可以看SDWebimage封装的opeation

operation流程化

可以看出opretaion可以继承类,所以取代了代码块,更加面向对象。

opretaion的生命周期可以看出,操作更加容易控制。

依赖是逻辑流程更加清晰可控。所以流程化复杂的场景更合适。

operationQueue

多线程:Operation和OperationQueue

operation:操作,一个任务可以当做是一个操作。例如:下载任务,上传任务,图片编解码任务,播放音视频...都可以看做是一个操作。

operationQueue:操作队列,这个操作队列负责把放入队列里的操作,按照一定顺序调度执行。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

电子商务:管理与社交网络视角(原书第7版)

电子商务:管理与社交网络视角(原书第7版)

(美)埃弗雷姆·特班(Efraim Turban)、戴维.金(David King)、李在奎、梁定澎、德博拉·特班(Deborrah Turban) / 时启亮、陈育君、占丽 / 机械工业出版社 / 2014-1-1 / 79.00元

本书对电子学习、电子政务、基于web的供应链、协同商务等专题进行了详细的介绍,全书涵盖丰富的资料以及个案,讨论了Web 2.0环境内的产业结构、竞争变化以及对当今社会的影响。另外,本书在消费者行为、协同商务、网络安全、网络交易及客户管理管理、电子商务策略等内容上都有最新的改编,提供读者最新颖的内容,贴近当代电子商务的现实。 本书适合高等院校电子商务及相关专业的本科生、研究生及MBA学员,也可......一起来看看 《电子商务:管理与社交网络视角(原书第7版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具