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

来源:互联网 发布:狸窝视频剪辑软件 编辑:程序博客网 时间:2024/05/29 14:18

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

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

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

一些常用的函数和属性:
这里写图片描述
func start() 启动这个操作
func main() 这个函数描述的是这个操作要处理的事务
var completionBlock: (() -> Void)? 操作完成后做什么

来看看BlockOperation,根据单次字面意思“闭包操作”容易理解这个类主要处理内容是闭包。来看提供的接口
这里写图片描述

//
// 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.}

}

运行结果
这里写图片描述

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

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

然后来了解下相关的属性和函数
这里写图片描述

来看看func addOperations([Operation], waitUntilFinished: Bool)第二个参数的作用
这里写图片描述

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.}

}

运行结果:
这里写图片描述

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

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

修改为

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

运行结果:

这里写图片描述

自定义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,这个有兴趣可以实验。

0 0
原创粉丝点击