Swift - 多线程实现方式(2) - NSOperation和NSOperationQueue

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 = "http://hangge.com/blog/images/logo.png"
         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 = "http://hangge.com/blog/images/logo.png"
         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" )
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值