2017-05-31 2 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 はスレッドセーフではありませためにAppleの側から意識的な設計上の決定です。それをスレッドセーフにすると、多くの点であなたを買わないでしょう。 パフォーマンスです。実際には多くのことが遅くなります。そして というUIKitがメインスレッドに結び付けられているという事実は、 並行プログラムを書くのが非常に簡単になり、UIKitを使用します。あなたがしなければならないのは、UIKitにコールされる が常にメインスレッド上に作られることです。したがって UIKitオブジェクトにアクセスする必要があります。 のメインスレッドは、パフォーマンスを優先するためにリンゴによるデザイン決定です。あなたはこの記事を通して、あなたの場合は

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

を行くことができ、より詳細な情報について

あなたがそうMainThreadの下でコードを記述する必要がありますので、あなたは別のスレッドからのアラートを示している、あなたが得ることができますコード

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

理由

下に使用して、メインスレッド

ココアタッチでUIApplicationつまりアプリケーションのインスタンスがメインスレッドに添付されています。このスレッドはUIApplicatioMain()で作成されているため、Cocoa Touchのエントリポイント機能です。アプリケーションの実行ループを含むメインイベントループを設定し、イベントの処理を開始します。アプリケーションのメインイベントループは、タッチ、ジェスチャーなどのすべてのUIイベントを受け取ります。

1

メインスレッドでアラートを表示しないとアラートが遅れることに注意してください。これは、メインスレッドで常にUIコードを実行する必要があるためです。

バックグラウンドスレッドでメインスレッドでコードを実行する場合は、async()に電話する必要があります。それはあなたがDispatchQueue.mainと呼ばれる方法です。これはメインスレッドです。

+0

に返信する必要があります。しかし、私はDispatchQueue.mainの部分をコメントするときに何の違いも見られませんでした。 – hackio

+0

場合によっては@hackioがありますが、それがメインスレッド上で実行されていないと、それを更新してその違いを見ることがあります。 –

関連する問題