2017-05-31 103 views
0

我是Swift新手,試圖檢查完成的項目。但有一些我不明白。爲什麼在Swift上顯示警報時需要DispatchQueue?

網絡請求完成後,應用程序會在條件下顯示警報。

func makeNetworkRequest() { 
    //newtork result... 
    DispatchQueue.main.async { 
     self.showAlert(versionMessage: "Error") 
    } 
} 

func showAlert(versionMessage: String) { 
    let alert = UIAlertView(title: "", message: versionMessage, delegate: self) 
    alert.show() 
} 

但是,它是用DispatchQueue完成的。在這種情況下,爲什麼需要使用DispatchQueue

+1

UI代碼必須始終在主隊列上完成。 – rmaddy

+0

和網絡(通常)是在主線外進行的。調度告訴內部代碼必須回到主線程 – GIJOW

+0

https://www.quora.com/Why-must-the-UI-always-be-updated-on-Main-Thread – JAL

回答

0

這是蘋果的一側有意識的設計決策沒有UIKit 是線程安全的。使其線程安全並不會給你帶來太多的性能方面的問題;它實際上會讓許多事情變慢。並且那UIKit連接到主線程使得它很容易編寫 併發程序並使用UIKit。所有你需要做的是確保 調用UIKit總是在主線程上。所以 根據這個事實UIKit對象必須訪問 主線程是由蘋果設計決定,以支持性能。

你可以去通過這篇文章

https://www.objc.io/issues/2-concurrency/thread-safe-class-design/

在你的情況更詳細的信息,你是顯示警告從另一個線程讓你有MainThread下寫代碼,這樣,就可以得到使用以下代碼

DispatchQueue.main.async { 
     // Your UI Updation here 
    } 

原因

主線程

在Cocoa Touch中,UIApplication即應用程序的實例附加到主線程,因爲此線程由UIApplicatioMain()(Cocoa Touch的入口點函數)創建。它設置主事件循環,包括應用程序的運行循環,並開始處理事件。應用程序的主事件循環接收所有UI事件,即觸摸,手勢等。

1

您一定會注意到,如果您未在主線程中顯示警報,則警報將滯後,這是因爲您的UI代碼始終必須在主線程上完成。

所以,如果你在後臺線程,並希望在主線程上執行代碼,你需要撥打async()。這就是你叫DispatchQueue.main,這是主線程。

+0

感謝您的答案。但是,在評論DispatchQueue.main部分時,我看不出任何區別。 – hackio

+0

有時它會執行@ hackio,如果是這樣,你不會在主線程上更新它,你會看到不同之處。 –

相關問題