[解決済み] iPhone - Grand Central Dispatch メインスレッド
2022-05-09 18:37:18
質問
私は自分のアプリケーションでGrand Central Dispatchをうまく使っていますが、このようなものを使うことの本当の利点は何なのでしょうか。
dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff
あるいは
dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff
つまり、どちらの場合も、アプリが実行されているメインスレッドで実行されるブロックを発行していることになり、これでは負荷を軽減することはできません。最初のケースでは、ブロックがいつ実行されるかを制御することはできません。ブロックを発射してから0.5秒後に実行されるケースを見たことがあります。2つ目のケースは、以下のような感じです。
[self doStuff];
ということですよね?
皆さんはどう思われますか。
解決方法は?
メインキューへのブロックのディスパッチは、通常、バックグラウンドの処理が終了したことを知らせるために、バックグラウンドのキューから行われます。
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
このケースでは、バックグラウンドのキューで長時間の計算を行っており、計算が完了したときにUIを更新する必要があります。UIの更新は通常メインキューから行う必要があるので、2つ目のネストした dispatch_async を使ってメインキューに 'signal' を送り返します。
メインキューにディスパッチして戻したい例は他にもあるでしょうが、一般的にはこの方法、つまりバックグラウンドキューにディスパッチするブロックの中にネストして行われます。
- バックグラウンド処理終了 -> UI更新
- バックグラウンドキューで処理されたデータチャンク -> 次のチャンクを開始するためにメインキューにシグナルを送る。
- バックグラウンドキューのネットワークデータ受信 -> メッセージが到着したことをメインキューに通知します。
- などなど
メインキューにディスパッチしたい理由としては から メイン・キューは... まあ、一般的にはありえないことですが、考えられるのは、次に実行ループを回るときに行う作業をスケジュールするために行うことでしょう。
関連
-
libc++abi.dylib が NSException 型の捕捉できない例外で終了する理由 エラー
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] SwiftでiOSキーボードを任意の場所でタッチして閉じる
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] 16進カラーバリューの使用方法
-
[解決済み] Swift 3でディスパッチキューを作成する方法
-
[解決済み】メインスレッドでタスクを実行するGCD
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
iOS classic error Undefined symbols for architecture XXX:
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] UITableViewCell、スワイプ時に削除ボタンを表示させる
-
[解決済み] UIButtonのタイトルを左揃えにするにはどうしたらよいですか?
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] SwiftでiOSキーボードを任意の場所でタッチして閉じる
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法