簡體   English   中英

如何在iOS Swift中進行多線程,並發或並行?

[英]How to do multithreading, concurrency or parallelism in iOS Swift?

有沒有辦法在Swift中創建一個工作線程?例如,如果有一個主要功能需要大量的計算,從而導致主線程延遲幾秒鍾,如果我想將該功能移動到一個單獨的線程或不阻塞主線程的線程有沒有辦法用Swift做?

我已經瀏覽了Swift的Apple文檔的基本和高級組件,但沒有關於並發或並行的內容,有人知道如何做(如果可能的話)嗎?

或者您也可以使用操作隊列。 在Swift 3中:

let queue = OperationQueue()

queue.addOperation() {
    // do something in the background

    OperationQueue.main.addOperation() {
        // when done, update your UI and/or model on the main queue
    }
}

無論是這個,還是安迪所說的 GCD都可以正常工作。

有關操作隊列和調度隊列(又名Grand Central Dispatch,GCD)的相對優點,請參閱Apple的並發編程指南 雖然該指南仍然使用Objective-C來說明示例,但是Swift中的API和概念基本相同(只是使用Swift語法)。 Xcode中的GCD和操作隊列文檔描述了Objective-C和Swift API。


順便說一下,你會注意到在上面的例子以及Andy的GCD演示中,我們使用了“尾隨閉包”。 例如,如果你看一下addOperationWithBlock定義,它定義為一個帶有一個參數的函數,它是一個“閉包”(類似於Objective-C中的一個塊):

func addOperation(_ block: @escaping () -> Swift.Void)

這可能會導致您假設您將按如下方式調用它:

queue.addOperation({
    // do something in the background
})

但是當函數的最后一個參數是閉包時,尾隨閉包語法允許你從函數的括號中取出最后的閉包參數,並在函數之后移動它,產生:

queue.addOperation() {
    // do something in the background
}

因為括號中沒有任何內容,您甚至可以更進一步,刪除那些空括號:

queue.addOperation {
    // do something in the background
}

希望這說明如何解釋NSOperationQueue / OperationQueue和/或GCD函數聲明並在您的代碼中使用它們。

您可以使用Grand Central Dispatch(GCD)執行此類任務。

這是一個基本的例子:

let backgroundQueue: dispatch_queue_t = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT)

// can be called as often as needed
dispatch_async(backgroundQueue) {
    // do calculations
}

// release queue when you are done with all the work
dispatch_release(backgroundQueue)

這個庫讓你以超級表達的方式描述並發:

func handleError(_ error) { ... }

HoneyBee.start(on: DispatchQueue.main) { root in
    root.setErrorHandler(handleError)
        .chain(function1) // runs on main queue
        .setBlockPerformer(DispatchQueue.global())
        .chain(function2) // runs on background queue
        .branch { stem in
            stem.chain(func3) // runs in parallel with func4
            +
            stem.chain(func4) // runs in parallel with func3
        }
        .chain(func5) // runs after func3 and func4 have finished
        .setBlockPerformer(DispatchQueue.main)
        .chain(updateUIFunc)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM