多線程開(kāi)發(fā)

異步

public typealias Task = () -> Void

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)
    }
    
}
//子線程做任務(wù)
public func async(_ task: @escaping Task){
    _async(task)
}
//子線程執(zhí)行完任務(wù)回到主線程做任務(wù)
public func async(_ task: @escaping Task, _ mainTask: Task? = nil) {
    _async(task, mainTask)
}
class HomeViewController: UIViewController {

    override func viewDidLoad() {
        //子線程執(zhí)行任務(wù)
        async {
            for _ in 0 ... 9 {
                print(Thread.current)
            }
        }
        //子線程執(zhí)行完任務(wù)回到主線程做任務(wù)
        _async({//子線程
            print(11111)
            for _ in 0 ... 999999 {

            }
            print(22222)
            print(Thread.current)
        }) {//主線程
            print(33333)
            print(Thread.current)
        }
  
        print(4444)
    } 
}
//x子線程做任務(wù).主線程任務(wù)可以傳空
        _async({
            print(Thread.current)
        }, nil)

延遲

public typealias Task = () -> Void

@discardableResult
public func delay(_ seconds: Double, _ block: @escaping Task) -> DispatchWorkItem {
    let item = DispatchWorkItem(block: block)
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds, execute: item)
    return item
}

class HomeViewController: UIViewController {

    override func viewDidLoad() {
        print(Date())
        delay(3) {
        print(Date())
        }
    }
}
//打印
2019-08-08 08:15:35 +0000
2019-08-08 08:15:38 +0000

異步延遲

public typealias Task = () -> Void
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
}
@discardableResult
public func asyncDelay(_ seconds: Double,_ task: @escaping Task) -> DispatchWorkItem {
    return _asyncDelay(seconds, task)
}

@discardableResult
public func asyncDelay(_ seconds: Double,_ task: @escaping Task,_ mainTask: Task? = nil) -> DispatchWorkItem {
    return _asyncDelay(seconds, task, mainTask)
}

class HomeViewController: UIViewController {

    override func viewDidLoad() {
        print(Date(),00000)//1
        asyncDelay(3) {
            print(Date(),1111,Thread.current)//4
        }
        print(Date(),222222)//2
        asyncDelay(3, {
            print(Date(),333333,Thread.current)//4
        }) {
            print(Date(),44444,Thread.current)//5
        }
        print(Date(),5555555)//3

    }
}
//打印
2019-08-08 08:56:41 +0000 0
2019-08-08 08:56:41 +0000 222222
2019-08-08 08:56:41 +0000 5555555
2019-08-08 08:56:44 +0000 1111 <NSThread: 0x60000144f400>{number = 4, name = (null)}
2019-08-08 08:56:44 +0000 333333 <NSThread: 0x600001457ac0>{number = 6, name = (null)}
2019-08-08 08:56:44 +0000 44444 <NSThread: 0x6000014061c0>{number = 1, name = main}

once

  • dispatch_onceSwift中已經(jīng)被廢棄,可以使用類(lèi)型屬性或者全局變量\常量默認(rèn)自帶lazy + dispatch_once效果
let age1: Int = {
    print(1111)
    return 10
}()


class HomeViewController: UIViewController {
    static let age2: Int = {
       print(2222)
        return 20
    }()
    
    override func viewDidLoad() {
       super.viewDidLoad()
        print(age1)
        print(age1)
        // 1111 10 10
        print(HomeViewController.self.age2)
        print(HomeViewController.self.age2)
        // 2222 20 20
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容