swift实现多线程的三种方式
实现多线程的方式有三种:
Thread,
Cocoa Operation(Operation和OperationQueue),
Grand Central Dispath(GCD)
Thread实现
快捷方式实现
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
//快捷方式实现
for i in 0..<10 {
Thread.detachNewThread {
print(i)
}
}
初始化器
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
//初始化器
class ObjectThread {
func threadTest() {
let thread = Thread(target: self, selector: #selector(threadExecute), object: nil)
thread.start()
}
@objc func threadExecute() {
print("threadExecuting1")
}
}
let obj = ObjectThread();
obj.threadTest()
Cocoa Operation(Operation和OperationQueue)实现
BlockOperation实现
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
//BlockOperation实现(代码可以多运行几次)
class ObjectOperation {
func threadTest() {
let operation = BlockOperation {[ weak self] in
self?.threadExecute()
}
let queue = OperationQueue()
queue.addOperation(operation)
}
func threadExecute() {
print("threadExecuting")
}
}
let objOperation = ObjectOperation()
objOperation.threadTest()
print("after invoke test")
自定义Operation实现
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
//自定义Operation实现
class ObjectOperation {
func threadTest() {
let operation = MyOperation()
let queue = OperationQueue()
queue.addOperation(operation)
}
}
class MyOperation: Operation {
override func main() {
sleep(1)
print("in MyOperation main")
}
}
let objOperation = ObjectOperation()
objOperation.threadTest()
print("after invoke test")
加入Operation的回调completionBlock
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
//加入Operation的回调completionBlock
class ObjectOperation {
func threadTest() {
let operation = MyOperation()
operation.completionBlock{ ()-> Void in
print("completionBlock")
}
let queue = OperationQueue()
queue.addOperation(operation)
}
}
class MyOperation: Operation {
override func main() {
sleep(1)
print("in MyOperation main")
}
}
let objOperation = ObjectOperation()
objOperation.threadTest()
print("after invoke test")
Grand Central Dispath(GCD)实现
同步sync
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
let queue = DispatchQueue(label: "myQueue", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
queue.sync {
sleep(1)
print("in queue sync")
}
print("after invoke queue method")
异步async
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
let queue = DispatchQueue(label: "myQueue", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
queue.async {
sleep(1)
print("in queue async")
}
print("after invoke queue method")
asyncAfter
import UIKit
import PlaygroundSupport
//不希望主线程代码实现完成之后就退出了
PlaygroundPage.current.needsIndefiniteExecution = true;
let queue = DispatchQueue(label: "myQueue", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
queue.asyncAfter(deadline: .now() + 1 ){
print("in asyncAfter")
}
print("after invoke queue method")
原文地址:https://blog.csdn.net/weixin_45279502/article/details/121969747
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。