1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueue) (3)Grand Central Dispath(GCD)
2,本文着重介绍Cocoa NSOperation Cocoa NSOperation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有NSOperation和 NSOperationQueue。其中NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的子 类:NSBlockOperation。创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
3,使用NSOperation的两种方式
(1)直接用定义好的子类:NSBlockOperation。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() var operation: NSBlockOperation = NSBlockOperation (block: { [ weak self ] in self ?.downloadImage() return }) //创建一个NSOperationQueue实例并添加operation var queue: NSOperationQueue = NSOperationQueue () queue.addOperation(operation) } //定义一个下载图片的方法,线程调用 func downloadImage(){ var imageUrl = "" var data = NSData (contentsOfURL: NSURL (string: imageUrl)!, options: nil , error: nil ) println (data?.length) } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } |
(2)继承NSOperation
然后把NSOperation子类的对象放入NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成,然后它被队列释放。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import UIKit class ViewController : UIViewController { override func viewDidLoad() { super .viewDidLoad() //创建线程对象 var downloadImageOperation: DownloadImageOperation = DownloadImageOperation () //创建一个NSOperationQueue实例并添加operation var queue: NSOperationQueue = NSOperationQueue () queue.addOperation(downloadImageOperation) } override func didReceiveMemoryWarning() { super .didReceiveMemoryWarning() } } class DownloadImageOperation : NSOperation { override func main(){ var imageUrl = "" var data = NSData (contentsOfURL: NSURL (string: imageUrl)!, options: nil , error: nil ) println (data?.length) } } |
4,设置运行队列并发数
NSOperationQueue队列里可以加入很多个NSOperation,可以把NSOperationQueue看做一个线程池,可往线程池中添加操作(NSOperation)到队列中。
可以设置线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样可以同时运行队列中的全部操作。
1 2 | //设置并发数 queue.maxConcurrentOperationCount = 5 |
5,取消队列所有操作
1 2 | //取消所有线程操作 queue.cancelAllOperations() |
6,每个NSOperation完成都会有一个回调表示任务结束
1 2 3 4 5 6 7 | //定义一个回调 var completionBlock:(() -> Void )? //给operation设置回调 operation.completionBlock = completionBlock dispatch_after(dispatch_time( DISPATCH_TIME_NOW , 4), dispatch_get_main_queue(), { println ( "Complete" ) }) |