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)