9.多线程

2020-05-06  本文已影响0人  迷心迷

如何创建一个线程

多线程可以做什么

多线程编程的方式

Thread

快捷方式创建

初始化器

Cocoa Operation
Operation

Operation
BlockOperation

Operation

isReady
isExecuting
isFinished
isCancelled

Operation

OperationQueue
BlockOperation
02
继承Operation
03
Operation 完成的回调
04

GCD

05
GCD-队列
GCD-队列API
06
GCD-基本操作

sync
async
asyncAfter

GCD-串行 vs 并行
07
GCD-同步 vs 异步
08
GCD-sync
GCD-async
GCD-asyncAfter
GCD 高级特性
DispatchGroup
11
DispatchGroup-wait
12
DispatchGroup-notify
13
DispatchSource
DispatchSource-Timer
14
GCD 源码剖析
15 16 17 18 19 20 21 22 23
线程安全和同步
死锁
临界区
竞态条件
优先级反转
27
并发与并行
28
Locks
29
SpinLock
synchronized
31 32 33 36 37 38 39
多线程典型场景
安全的Array
40 41 42
其他模式
Promise
43 44
Pipeline
45
Master/Slave
46
Serial Thread Confinement

应用实例

public typealias Task = () -> Void

public struct Asyncs {
    public static func async(_ task: @escaping Task) {
        _async(task)
    }
    public static func async(_ task: @escaping Task,
                             _ mainTask: @escaping Task) {
        _async(task, mainTask)
    }
    private static func _async(_ task: @escaping Task,
                               _ mainTask: Task? = nil) {
        let item = DispatchWorkItem(block: task)
        DispatchQueue.global().async(execute: item)
        if let main = mainTask {
            item.notify(queue: DispatchQueue.main, execute: main)
        }
    }
    
    @discardableResult
    public static func delay(_ seconds: Double,
                             _ block: @escaping Task) -> DispatchWorkItem {
        let item = DispatchWorkItem(block: block)
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds,
                                      execute: item)
        return item
    }
    
    @discardableResult
    public static func asyncDelay(_ seconds: Double,
                                  _ task: @escaping Task) -> DispatchWorkItem {
        return _asyncDelay(seconds, task)
    }
    
    @discardableResult
    public static func asyncDelay(_ seconds: Double,
                                  _ task: @escaping Task,
                                  _ mainTask: @escaping Task) -> DispatchWorkItem {
        return _asyncDelay(seconds, task, mainTask)
    }
    
    private static func _asyncDelay(_ seconds: Double,
                                    _ task: @escaping Task,
                                    _ mainTask: Task? = nil) -> DispatchWorkItem {
        let item = DispatchWorkItem(block: task)
        DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + seconds,
                                          execute: item)
        if let main = mainTask {
            item.notify(queue: DispatchQueue.main, execute: main)
        }
        return item
    }
    

}
public struct Cache {
    private static var data = [String: Any]()
//    private static var lock = DispatchSemaphore(value: 1)
//    private static var lock = NSLock()
    private static var lock = NSRecursiveLock()
    
    public static func get(_ key: String) -> Any? {
        data[key]
    }
    
    public static func set(_ key: String, _ value: Any) {
//        lock.wait()
//        defer { lock.signal() }
        
        lock.lock()
        defer { lock.unlock() }
        
        data[key] = value
    }
}
上一篇 下一篇

猜你喜欢

热点阅读