iOS点滴iOS 开发

Swift之多线程 -- NSOperation和NSOpera

2015-12-05  本文已影响284人  就怕是个demo

NSOperation是苹果公司在GCD基础上进行的一次封装,相比GCD,NSOperation能处理大量的并发请求,更好的处理队列之间的依赖关系,缺点是比GCD稍慢。
1、首先,NSOperation的简单使用

let myOperation = NSBlockOperation { () -> Void in
    //1、请求操作
    ...
    //2、结合GCD更新UI
    dispatch_async(dispatch_get_main_queue()) { () -> Void in
        //通知主线程更新UI
        ...
    }
}  
//myOperation.completionBlock = {
        //调用完成之后调用该闭包
        ...
//} 
NSOperationQueue().addOperation(myOperation)

此外,还可以追加一个请求到请求队列

...
//追加一个请求到队列
myOperation.addExecutionBlock { () -> Void in
//请求操作
...
}
NSOperationQueue().addOperation(myOperation)

2、自定义NSOperation

import UIKit

/**
 *声明协议,用于更新UI
 */
protocol opCompletionDelegate {
    //参数因实际需要而定
    func opCompletion(data: NSData)
}

class MyOperation: NSOperation {

    var delegate: opCompletionDelegate?

    //重写main方法
    override func main() {
        super.main()
    
        //请求操作
        //...
        //更新UI
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            //更新UI操作
            if let myDelegate = self.delegate {
                myDelegate.opCompletion(...)
            }
        }
    }
}

随后在需要的地方实现协议,更新UI

let myOperation = MyOperation()
myOperation.delegate = self
NSOperationQueue().addOperation(myOperation)

func opCompletion(data: NSData) {
    //更新UI
    ...
}

3、依赖关系

let myOperation1 = NSBlockOperation { () -> Void in
    //1、请求操作
    ...
    //2、结合GCD更新UI
    dispatch_async(dispatch_get_main_queue()) { () -> Void in
        //通知主线程更新UI
        ...
    }
}  
//myOperation1.completionBlock = {
        //调用完成之后调用该闭包
        ...
//} 

let myOperation2 = NSBlockOperation { () -> Void in
    //1、请求操作
    ...
    //2、结合GCD更新UI
    dispatch_async(dispatch_get_main_queue()) { () -> Void in
        //通知主线程更新UI
        ...
    }
}  
//myOperation2.completionBlock = {
        //调用完成之后调用该闭包
        ...
//}

//操作1依赖于操作2, 等于操作2完成之后操作1才开始
myOperation1.addDependency(myOperation2)

let myOperationQueue = NSOperationQueue()
myOperationQueue.addOperation(myOperation1)
myOperationQueue.addOperation(myOperation2)
上一篇 下一篇

猜你喜欢

热点阅读