两个都是面向对象的
取消,依赖,优先级处理,复杂逻辑,保存业务状态,子类化
Operation分为两类
- Operation
相当于父类
- BlockOperation
继承父类 可以用传递闭包进行操作
Opreation
分别有四种状态
- isReady
- isExecuting
- isFinished
- isCancelled
运行状态有两种
- sync 同步
需要实现main()方法
- async 异步 (网络操作)
start() 开启线程方法
isAsynchronous 是否异步
isExecuting 是否执行中
isFinished 是否结束
可以添加或者删除依赖
addDependency(Operation)
reoveDependency(Operation)
denpendencies:[Operation]
也就是另外的一个Operation执行完毕后才能执行当前的operation
OpreationQueue
- OperationQueue队列里可以加入很多个Operation,可以把OperationQueue看做一个线程池,可往线程池中添加操作(Operation)到队列中
- 底层使用GCD
- maxConcurremtOperationCount可以设置最大并发数
- defalutMaxConturrenOperationCount 根据当前系统条件确定的最大并发数
- 可以取消所有Operation,但是当前正在执行的不会取消。
- 所有Operation执行完毕后退出销毁
BlockOperation
code
//: FROM https://www.anuomob.com
import UIKit
import PlaygroundSupport
//不希望主线程执行完毕就结束
PlaygroundPage.current.needsIndefiniteExecution = true
class ObjectForThread{
func threadTest(){
let operation = BlockOperation(block: {[weak self] in
self?.threadWorker()
return
})
let queue=OperationQueue()
queue.addOperation(operation)
print("threadTest")
}
@objc func threadWorker(){
print("threadWorker")
}
}
let obj = ObjectForThread()
obj.threadTest()
继承Operation
//: FROM https://www.anuomob.com
import UIKit
import PlaygroundSupport
//不希望主线程执行完毕就结束
PlaygroundPage.current.needsIndefiniteExecution = true
class ObjectForThread{
func threadTest(){
let operation = MyOperation()
let queue = OperationQueue()
queue.addOperation(operation)
print("threadTest")
}
}
class MyOperation:Operation{
override func main() {
sleep(1)
print("MyOperation")
}
}
let obj = ObjectForThread()
obj.threadTest()
Opeartion 完成的回调
completionBlock
//: FROM https://www.anuomob.com
import UIKit
import PlaygroundSupport
//不希望主线程执行完毕就结束
PlaygroundPage.current.needsIndefiniteExecution = true
class ObjectForThread{
func threadTest(){
let operation = MyOperation()
operation.completionBlock = {()-> Void in
print("--operation.completionBlock--")
}
let queue = OperationQueue()
queue.addOperation(operation)
print("threadTest")
}
}
class MyOperation:Operation{
override func main() {
sleep(1)
print("MyOperation")
}
}
let obj = ObjectForThread()
obj.threadTest()