Swift 5.x 多线程

2020-07-11  本文已影响0人  ShenYj

Swift多线程编程方案:


1. Thread在三种多线程技术中是最轻量级的, 但需要自己管理线程的生命周期和线程同步. 线程同步对数据的加锁会有一定的系统开销.

e.g.

for i in 0...10 {
    Thread.detachNewThread {
        print("\(i) \(Thread.current)")
    }
}

输出结果:

8 <NSThread: 0x6000000f8e40>{number = 12, name = (null)}
10 <NSThread: 0x6000000f0240>{number = 17, name = (null)}
7 <NSThread: 0x6000000cc0c0>{number = 10, name = (null)}
1 <NSThread: 0x6000000c0180>{number = 14, name = (null)}
6 <NSThread: 0x6000000efe80>{number = 9, name = (null)}
4 <NSThread: 0x6000000efdc0>{number = 11, name = (null)}
5 <NSThread: 0x6000000c8580>{number = 15, name = (null)}
9 <NSThread: 0x6000000cc080>{number = 8, name = (null)}
0 <NSThread: 0x6000000fd300>{number = 7, name = (null)}
2 <NSThread: 0x6000000cc5c0>{number = 13, name = (null)}
3 <NSThread: 0x6000000f0780>{number = 16, name = (null)}

e.g.

class ObjectForThread {
    func threadTest() -> Void {
        let thread = Thread(target: self, selector: #selector(threadWorker), object: nil)
        thread.start()
        print("threadTest")
    }
    @objc func threadWorker() -> Void {
        print("threadWorker Run")
    }
}

let obj = ObjectForThread()
obj.threadTest()

输出结果:

threadTest
threadWorker Run


2. OperationOperationQueue

Operation

Operation的四种状态 :

OperationQueue

e.g. BlockOperation

class ObjectForThread {
    func threadTest() -> Void {
        let operation = BlockOperation { [weak self] in
            self?.threadWorker()
        }
        let queue = OperationQueue()
        queue.addOperation(operation)
        print("threadTest")
    }
}

let obj = ObjectForThread()
obj.threadTest()

e.g. 自定义的Operation

class ObjectForThread {
    func threadTest() -> Void {
        let operation = MyOperation()
        operation.completionBlock = {() -> Void in
            print("完成回调")
        }
        let queue = OperationQueue()
        queue.addOperation(operation)
        print("threadTest")
    }
}
class MyOperation: Operation {
    override func main() {
        sleep(1)
        print("MyOperation")
    }
}

let obj = ObjectForThread()
obj.threadTest()

3. GCD

GCD特点

GCD - 队列

GCD - 队列API

GCD 队列.png

e.g.

let queue = DispatchQueue(label: "myQueue", qos: .default, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
queue.async {
    sleep(3)
    print("queue")
}
print("end")

e.g.

let queue = DispatchQueue(label: "myQueue", qos: .default, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
queue.asyncAfter(deadline: DispatchTime.now() + 10) {
    print("in asyncAfter")
}
print("end")

DispatchTime 系统时钟
DispatchWallTime生活时间

GCD 高级特性- DispatchGroup

e.g. 阻塞当前线程

let group = DispatchGroup()
let queue = DispatchQueue(label: "test.queue")

group.enter()
queue.async {
    sleep(3)
    print("操作 1")
    group.leave()
}

group.enter()
queue.async {
    sleep(3)
    print("操作 2")
    group.leave()
}

print("操作1 操作2 安排完成")

group.wait()
print("操作1 操作2 全部执行完毕")

e.g. 非阻塞方式:

let group = DispatchGroup()
let queue = DispatchQueue(label: "test.queue")

group.enter()
queue.async {
    sleep(3)
    print("操作 1")
    group.leave()
}

group.enter()
queue.async {
    sleep(3)
    print("操作 2")
    group.leave()
}

print("操作1 操作2 安排完成")

group.notify(queue: queue) {
    print("操作1 操作2 全部执行完毕")
}
print("非阻塞")

GCD 高级特性- DispatchSource

e.g. DispatchSource- Timer

var seconds = 10
let timer: DispatchSourceTimer = DispatchSource.makeTimerSource(flags: .strict, queue: .global())
timer.schedule(deadline: .now(), repeating: 1.0)
timer.setEventHandler {
    seconds -= 1
    if seconds < 0 {
        timer.cancel()
    }
    else {
        print(seconds)
    }
}
timer.resume()
上一篇 下一篇

猜你喜欢

热点阅读