iOS --- 多线程之NSOperation

来源:互联网 发布:js div边框 编辑:程序博客网 时间:2024/05/07 03:45

NSOperation基于GCD封装实现的,比GCD稍慢,可设定各个操作之间的依赖关系及优先级等。相对于GCD而言,NSOperation主要会涉及到使用NSOperationQueue来调度和管理各个NSOperation对象及操作。

NSBlockOperation

let myOperation = NSBlockOperation(block: { () -> Void in    // self.delayAction()    dispatch_async(dispatch_get_main_queue(), { () -> Void in        // self.updateUI()    })})// 设置完成之后的block操作myOperation.completionBlock = { () -> Void in    // completion block}myOperation.addExecutionBlock({ () -> Void in    // action    dispatch_async(dispatch_get_main_queue(), { () -> Void in        // update UI    })})NSOperationQueue().addOperation(myOperation)// 也可以直接使用如下方法// myOperation.start()// myOperation.cancel()

Dependency

操作之间可以添加依赖关系,既可以设置执行的先后顺序

let myOperation1 = NSBlockOperation(block: { () -> Void in    // operation 1})let myOperation2 = NSBlockOperation(block: { () -> Void in    // operation 2})// 若不添加依赖关系,则两个任务的执行顺序随机myOperation1.addDependency(myOperation2)// myOperation1.removeDependency(myOperation2)// 默认是并行队列let myOperationQueue = NSOperationQueue()myOperationQueue.addOperation(myOperation1)myOperationQueue.addOperation(myOperation2)

Priority

let myOperation1 = NSBlockOperation(block: { () -> Void in    print("myOperation1")})let myOperation2 = NSBlockOperation(block: { () -> Void in    print("myOperation2")})// 优先级并不一定等于依赖关系,只是系统调度时候倾向而已。// 两次执行的顺序也可能不一样,并非强制排序。myOperation1.queuePriority = NSOperationQueuePriority.VeryLowmyOperation2.queuePriority = NSOperationQueuePriority.VeryHighlet myOperationQueue = NSOperationQueue()myOperationQueue.addOperation(myOperation1)myOperationQueue.addOperation(myOperation2)

maxConcurrentOperationCount

let myOperation1 = NSBlockOperation(block: { () -> Void in    print("myOperation1")})let myOperation2 = NSBlockOperation(block: { () -> Void in    print("myOperation2")})let myOperationQueue = NSOperationQueue()// 该并发队列中,一次只能执行一个任务,所以顺序固定myOperationQueue.maxConcurrentOperationCount = 1myOperationQueue.addOperation(myOperation1)myOperationQueue.addOperation(myOperation2)

cancel和suspeded

let myOperation1 = NSBlockOperation(block: { () -> Void in    print("myOperation1")})let myOperationQueue = NSOperationQueue()myOperationQueue.addOperation(myOperation1)// myOperation1.cancel()// myOperationQueue.cancelAllOperations()// myOperation1.waitUntilFinished() // 会阻塞主线程myOperationQueue.suspended = true // 只能暂停后添加的操作,已添加的不能暂停

NSOperationQueue

NSOperationQueue用来生成一个队列,将NSOperation对象可添加进去。例如,使用NSURLConnection操作,可指定对应的operationQueue。也可用于防止出现多次重复的http请求。不过,一般网络请求都不放在mainQueue中。

NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler: { (response: NSURLResponse?, data: NSData?, error: NSError?) -> Voin in    // Parse request data})

自定义任务队列

先定义一个CSOperation的类,继承自NSOperation,如下:

protocol CSOperationCompletionDelegate {    func csOperationCompletion()}// 自定义NSOperationclass CSOperation: NSOperation {    var delegate: CSOperationCompletionDelegate!    override func main() {        super.main()        sleep(2)        dispatch_async(dispatch_get_main_queue(), { () -> Void in            if (self.delegate != nil) {                self.delegate.csOperationCompletion()            }        })    }}

使用如下,将该类的对象添加到OperationQueue即可。

let csOperation = CSOperation()csOperation.delegate = selfNSOperationQueue().addOperation(csOperation)// 继承CSOperationCompletionDelegate协议func csOperationCompletion() {    print("csOperationCompletion")}

Demo

Demo地址: DemoMultiThread

0 0
原创粉丝点击