(swift) iOS线程二 ——Operation和OperationQueue简单用法

swift学习
二、Operation和OperationQueue简单用法

首先还是先查看一下这两个class的开发说明:

(swift) iOS线程二 ——Operation和OperationQueue简单用法_第1张图片
(开发说明中NSOperation的一些链接已经取消了,已经被替换为Operation,以下就引用“Operation”或者“操作”来说明)这里说,Operation是一个抽象类,可以用来封装一个任务,其中包含代码逻辑和数据。因为Operation是抽象类,所以编写代码时不能直接使用,要使用它的子类,系统默认提供的有NSInvocationOperation(新版本中已经取消)和BlockOperation。虽然Operation是抽象类,但是实现任务安全执行的逻辑已经实现,在使用的时候你只需要关注你任务中逻辑处理。

一些常用的函数和属性:
(swift) iOS线程二 ——Operation和OperationQueue简单用法_第2张图片
func start() 启动这个操作
func main() 这个函数描述的是这个操作要处理的事务
var completionBlock: (() -> Void)? 操作完成后做什么

来看看BlockOperation,根据单次字面意思“闭包操作”容易理解这个类主要处理内容是闭包。来看提供的接口
(swift) iOS线程二 ——Operation和OperationQueue简单用法_第3张图片

//
// ViewController.swift
// OperationLearn
//
// Created by QinJeoy on 2016/10/22.
// Copyright © 2016年 QinJeoy. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
var operation = BlockOperation{
for i in 0…5 {
print(“operation 1 — (i)”)
}
}
var operation2 = BlockOperation()

override func viewDidLoad() {
    super.viewDidLoad()
    operation.start()

    operation2.addExecutionBlock {
        for i in 0...5 {
            print("operation2 - 1 --- \(i)")
        }
    }

    operation2.addExecutionBlock {
        for i in 0...5 {
            print("operation2 - 2 --- \(i)")
        }
    }
    operation2.start()
    print("operation -- start/end!")

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

运行结果
(swift) iOS线程二 ——Operation和OperationQueue简单用法_第4张图片

冲输出的记过来看,operation的执行是在当前线程中的没有新线程参与。还有要注意的是操作是一次性的。

(swift) iOS线程二 ——Operation和OperationQueue简单用法_第5张图片
(新版本好像去掉了很多NS,用惯java了这样看着顺眼多了–!)这里说,OperationQueue(操作队列)是用来控制一系列操作对象执行的。操作对象被添加进队列后,一直存在到操作被取消或者执行完成(这么看来操作是一次性的)。队列里的操作对象(这里指的是没有执行的)执行的顺序有操作的优先级和操作之间的依赖决定。一个应用里可以创建多个队列进行操作处理。

然后来了解下相关的属性和函数
(swift) iOS线程二 ——Operation和OperationQueue简单用法_第6张图片

来看看func addOperations([Operation], waitUntilFinished: Bool)第二个参数的作用
(swift) iOS线程二 ——Operation和OperationQueue简单用法_第7张图片

waitUntilFinished为true是将阻塞当前线程知道将添加的操作执行完成,false择不阻塞,说白了就是同步跟异步的控制吧。

然后看看上面最后一个函数 func waitUntilAllOperationsAreFinished()这个函数的作用也是阻塞当前线程等待队列操作执行完成。既然单独提供了这个函数,是不是就可以理解队列执行操作本身是异步的呢?

现在修改代码

//
// ViewController.swift
// OperationLearn
//
// Created by QinJeoy on 2016/10/22.
// Copyright © 2016年 QinJeoy. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
var operationqueue = OperationQueue()

var operation = BlockOperation{
    for i in 0...20 {
        Thread.sleep(forTimeInterval: 0.1)
        print("operation 1 --- \(i)")
    }
}
var operation2 = BlockOperation()


override func viewDidLoad() {
    super.viewDidLoad()
//        operation.start()
    operation2.addExecutionBlock {
        for i in 0...20 {
            Thread.sleep(forTimeInterval: 0.1)
            print("operation2 - 1 --- \(i)")
        }
    }

    operation2.addExecutionBlock {
        for i in 0...20 {
            Thread.sleep(forTimeInterval: 0.1)
            print("operation2 - 2 --- \(i)")
        }
    }
    //        operation2.start()
    operationqueue.addOperation(operation);
    operationqueue.addOperation(operation2);
    print("operation -- start/end!")

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

运行结果:
(swift) iOS线程二 ——Operation和OperationQueue简单用法_第8张图片

可以看出现在运行时异步的,而且操作好像是并发的。现在修改代码让operation先执行完再执行operation2.

operationqueue.addOperation(operation);
operationqueue.addOperation(operation2);
print("operation -- start/end!")

修改为

operationqueue.addOperation(operation);
operationqueue.waitUntilAllOperationsAreFinished()
operationqueue.addOperation(operation2);
print("operation -- start/end!")

运行结果:

(swift) iOS线程二 ——Operation和OperationQueue简单用法_第9张图片

自定义Operation:

实现Operation的子类

class JTask: Operation {
    override func main() {
        for i in 0...20 {
            Thread.sleep(forTimeInterval: 0.1)
            print("JTask print --- \(i)")
        }
    }
}

//使用
operationqueue.addOperation(JTask())

从上的实验来看,使用队列操作可以并发,但是没操作结束怎么去处理,比如说一个下载操作完成后我们希望得到通知或者回调,那就要用到Operation的这个属性 var completionBlock: (() -> Void)? 这是一个闭包。

OperationQueue处理任务是并发的,可以使用
这里写图片描述
来指定队列并发操作的最大限制,默认值是-1,这个有兴趣可以实验。

你可能感兴趣的:(swift学习记录)