微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从OC到Swift8 - 多线程

多线程开发 - 异步

public typealias Task = () -> Void
public class 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)
        }
    }
}
Asyncs.async({
    print(1, Thread.current)
}) {
    print(2, Thread.current)
}
1 <NSThread: 0x6000033ec540>{number = 3, name = (null)}
2 <NSThread: 0x600003383bc0>{number = 1, name = main}

多线程开发 - 延迟

public typealias Task = () -> Void
public class Asyncs {
    @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
    }
}    
Asyncs.delay(3) {
  print(1)
}

多线程开发 - 异步延迟

public typealias Task = () -> Void
public class Asyncs {
    @discardableResult
    public static func asyncDelay(_ seconds: Double,
                                  _ task: @escaping Task) -> dispatchWorkItem {
        let item = _asyncDelay(seconds, task)
        return item
    }
    @discardableResult
    public static func asyncDelay(_ seconds: Double,
                             _ task: @escaping Task,
                             _ mainTask: @escaping Task) -> dispatchWorkItem {
        let item = _asyncDelay(seconds, task, mainTask)
        return item
    }
    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
    }
}
print(1)
Asyncs.asyncDelay(3, {
    print(2)
}) {
    print(3)
}  
  • 返回dispatchWorkItem,是因为可以cancel

多线程开发 - once

let age1: Int = {
    print(666)
    return 10
}()
class ViewController: UIViewcontroller {
    static let age2: Int = {
        print(888)
        return 20
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        print(age1)
        print(age1)
        // 666 10 10
        print(ViewController.age2)
        print(ViewController.age2)
        // 888 20 20
    }
}
  • 多线程开发 - 加锁
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? {
        return data[key]
    }
    public static func set(_ key: String, _ value: Any) {
//        lock.wait()
//        defer {
//            lock.signal()
//        }
        lock.lock()
        defer {
            lock.unlock()
        }
        data[key] = value
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐