なぜ並行性なのか?
データの読み込みなどの重いタスクをアプリに追加するとすぐに、UIの動作が遅くなったり、フリーズすることさえあります。並行性により、2つ以上のタスクを「同時に」実行できます。このアプローチの欠点は、スレッドの安全性が常に制御しやすいとは限らないことです。異なるスレッドで同じ変数を変更しようとしたり、異なるスレッドによってすでにブロックされているリソースにアクセスしたりするなど、異なるタスクが同じリソースにアクセスする場合。
認識しておく必要があるいくつかの抽象化があります。
- キュー。
- 同期/非同期タスクのパフォーマンス。
- 優先事項。
- 一般的なトラブル。
キュー
シリアルまたは同時でなければなりません。だけでなく、グローバルまたはプライベート同時に。
シリアルキューでは、タスクは1つずつ完了しますが、並行キューでは、タスクが同時に実行され、予期しないスケジュールで完了します。同じタスクのグループは、並行キューと比較して、シリアルキューの方が時間がかかります。
独自のプライベートキュー(シリアルまたは同時)を作成するか、すでに利用可能なグローバル(システム)キューを使用できます。メインキューがあるだけで、シリアルキューのすべてのアウトのグローバルキュー。
メインキュー(ネットワークからのデータのロード)でUI作業に言及されていない重いタスクを実行しないでください。代わりに、他のキューでそれらを実行して、UIのフリーズを維持し、ユーザーアクションに応答できるようにすることを強くお勧めします。他のキューでUIを変更すると、予期しない別のスケジュールと速度で変更が行われる可能性があります。一部のUI要素は、必要になる前または後に描画できます。UIがクラッシュする可能性があります。また、グローバルキューはシステムキューであるため、システム上で実行できるタスクが他にもあることに注意してください。
サービス品質/優先度
また、キューにはさまざまなqos(サービス品質)があり、タスクの実行優先度(ここでは最高から最低)を設定します。
.userInteractive - メインキューが
.userInitiatedを -ユーザー開始タスクのため、その上にいくつかの応答のためのユーザーの待機
.utility -タスク用これには時間がかかり、即時の応答は必要ありません。たとえば、データ
.backgroundの操作 -視覚部分に関連せず、完了時間が厳密ではないタスクの場合)。QoS情報を転送しない.defaultキュー
もあります。QoSを検出できなかった場合、
qosは.userInitiatedと.utilityの間で使用されます。
タスクは同期または非同期で実行できます。
一般的なトラブル。
同時実行アプリの投影中にプログラマが犯す最も一般的な間違いは次のとおりです。
- 競合状態 -アプリの動作がコードパーツの実行順序に依存する場合に発生します。
- 優先順位の逆転 -いくつかのリソースがブロックされているために、優先順位の高いタスクが優先順位の低いタスクが完了するのを待つ場合
- デッドロック -ソース(変数、データなど)がこれらのキューのいくつかによってすでにブロックされているのをいくつかのキューが無限に待機している場合。
メインキューで同期関数を呼び出さないでください。
メインキューで同期関数を呼び出すと、キューがブロックされ、キューはタスクの完了を待機しますが、キューが原因でタスクを開始できないため、タスクは完了しませんすでにブロックされています。これはデッドロックと呼ばれます。
同期を使用するタイミング
タスクが完了するまで待つ必要がある場合。いくつかの関数/メソッドが二重に呼び出されないことを確認しているときのFe。同期が完了しており、完全に完了するまで二重に呼び出されないようにしています。この問題のコードを次に示します。
ます。IOSデバイスでエラークラッシュレポートが発生した原因を見つける方法は?
DispatchQueue.main.sync
バックグラウンドスレッドから呼び出すのは間違っているでしょうか?