Swift - 多线程实现方式(2) - Operation和OperationQueue
1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:
(1)Thread
(2)Cocoa Operation(Operation和OperationQueue)
(3)Grand Central Dispath(GCD)
2,本文着重介绍Cocoa Operation
Cocoa Operation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有Operation和OperationQueue。其中Operation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的子类:BlockOperation。创建Operation子类的对象,把对象添加到OperationQueue队列里执行。
(2)继承Operation
4,设置运行队列并发数
5,取消队列所有操作
6,每个Operation完成都会有一个回调表示任务结束
(1)Thread
(2)Cocoa Operation(Operation和OperationQueue)
(3)Grand Central Dispath(GCD)
2,本文着重介绍Cocoa Operation
Cocoa Operation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有Operation和OperationQueue。其中Operation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的子类:BlockOperation。创建Operation子类的对象,把对象添加到OperationQueue队列里执行。
(本文代码已全部升级至Swift3)
3,使用Operation的两种方式
(1)直接用定义好的子类:BlockOperation。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let operation = BlockOperation(block: { [weak self] in self?.downloadImage() return }) //创建一个NSOperationQueue实例并添加operation let queue = OperationQueue() queue.addOperation(operation) } //定义一个下载图片的方法,线程调用 func downloadImage(){ let imageUrl = "http://hangge.com/blog/images/logo.png" let data = try! Data(contentsOf: URL(string: imageUrl)!) print(data.count) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
(2)继承Operation
然后把Operation子类的对象放入OperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成,然后它被队列释放。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //创建线程对象 let downloadImageOperation = DownloadImageOperation() //创建一个OperationQueue实例并添加operation let queue = OperationQueue() queue.addOperation(downloadImageOperation) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } class DownloadImageOperation: Operation { override func main(){ let imageUrl = "http://hangge.com/blog/images/logo.png" let data = try! Data(contentsOf: URL(string: imageUrl)!) print(data.count) } }
4,设置运行队列并发数
OperationQueue队列里可以加入很多个Operation,可以把OperationQueue看做一个线程池,可往线程池中添加操作(Operation)到队列中。
可以设置线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样可以同时运行队列中的全部操作。
//设置并发数 queue.maxConcurrentOperationCount = 5
5,取消队列所有操作
//取消所有线程操作 queue.cancelAllOperations()
6,每个Operation完成都会有一个回调表示任务结束
//给operation设置回调 operation.completionBlock = { () -> Void in print("--- operation.completionBlock ---") }