Swift 中的多线程
-
Thread
-
Cocoa Operation (Operation 和 OperationQueue)
- 面向对象
- 取消, 依赖, 任务优先级,复杂逻辑,保存业务状态,子类化
-
Grand Central Dispath (GCD)
Thread
-
轻量级
-
需要自己管理线程的声明周期和线程同步
快捷方式创建
detachNewThread(_ block: @escaping() -> void)- 输入一个逃逸闭包,可以稍后执行
detachNewThreadSelector(_ selector: Selector, toTarget target: Any, with argument: Any? )
初始化器
Thread(target:, selector:, object:)- 需要手动
start线程
for i in 0..<10 {
Thread.detachNewThread {
print(i)
}
}
class ObjectThread {
func threadTest() {
let thread = Thread(target: self, selector: #selector(threadWorker), object: nil)
thread.start()
}
@objc func threadWorker() {
print("threadWorker")
}
}
let obj = ObjectThread()
obj.threadTest()
Operation
- Operation
- 状态
- isReady, isExecuting, isFinished, isCancelled
- sysc
- main()
- async
- start() -> isAsynchronous -> isEexcuting -> isFinished
- AfNetWorking
- 添加和移除依赖
- 状态
- OperationQueue
- 线程池,可将Opeartion添加到队列中
- 底层使用GCD
- maxConcurrentOperationCount 可以设置最大并发数
- defaultMaxConcurrentOperationCount根据当前系统条件动态确定的最大并发数
- 可以取消所以Operation,但是目前正在执行的不会取消
- 所以Operation执行完毕后退出销毁
- BlockOperation
class ObjectOperation { func test() { let operation = BlockOperation { [weak self] in self?.threadWorker() } let queue = OperationQueue() queue.addOperation(operation) } @objc func threadWorker() { sleep(1) print("threadWorker") } } let obj = ObjectOperation() obj.test() print("after invoke test") - 继承Operation
class ObjectOperation { func test() { let operation = MyOperation() let queue = OperationQueue() queue.addOperation(operation) } @objc func threadWorker() { sleep(1) print("threadWorker") } } class MyOperation: Operation { override func main() { sleep(1) print("in MyOperation main") } } let obj = ObjectOperation() obj.test() print("after invoke test") - Operation 完成的回调
- completionBlock
class ObjectOperation { func test() { let operation = MyOperation() operation.completionBlock = { () -> Void in print("completionBlock") } let queue = OperationQueue() queue.addOperation(operation) } @objc func threadWorker() { sleep(1) print("threadWorker") } } class MyOperation: Operation { override func main() { sleep(1) print("in MyOperation main") } } let obj = ObjectOperation() obj.test() print("after invoke test")