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
- iOS多线程之NSOperation
- iOS多线程之NSOperation
- iOS多线程之NSOperation
- ios多线程之NSOperation
- IOS多线程之NSOperation
- iOS多线程之NSOperation
- iOS --- 多线程之NSOperation
- iOS-多线程之NSOperation
- iOS -- 多线程之NSOperation
- iOS多线程之NSOperation
- IOS多线程之NSOperation
- iOS多线程之NSOperation
- ios 多线程之NSOperation
- IOS多线程开发之NSOperation
- iOS多线程之二 NSOperation
- iOS多线程编程之NSOperation
- iOS整理 -- 多线程之 NSOperation
- iOS多线程编程之NSOperation
- 在ScrollView中嵌套ListView能显示所有数据
- 安卓开发全屏实现方法
- 系统零件
- 如若平淡,挺好:站在听讲人的角度去备课
- struts2基于xml配置方式对Action方法进行校验
- iOS --- 多线程之NSOperation
- C#WebBrowser控件使用教程与技巧收集--苏飞收集
- SDN与OpenFlow技术简介
- struts2验证框架将验证信息输出到指定位置
- 使用lock(this)需要谨慎
- apache storm集群配置记录
- 分布式环境下Spark与HDFS的配置
- android 双缓冲分析一些基本的原理
- 教育启发