3

プライベート ディスパッチ キューで内部的に何らかの作業を行うオブジェクトがあるとします (GCD に慣れていない人はスレッドを考えてください)。このオブジェクトは、実行中のさまざまな時点でデリゲートに通知します。コードが現在実行されているプラ​​イベート キューからデリゲート メソッドを呼び出すのは悪い考えですか? それとも、よりよく知られているキューで呼び出す必要がありますか? 後者の場合、どのキューですか? メイン キューが常に希望どおりになるとは限らないようです。

オプション A

dispatch_async(private_queue, ^{
    // Do some work...
    [self.delegate tellItWorkWasDone:self];
});

オプション B

dispatch_async(private_queue, ^{
    // Do some work...
    dispatch_sync(dispatch_get_main_queue(), ^{
        [self.delegate tellItWorkWasDone:self];
    });
});

オプション A には、単純であるという利点がありますが、デリゲート メソッドを実装する人は誰でも、実際には実行してはならないキューでコードを実行することになるという欠点があります。おそらくオプション B の方が安全ですが、main_queue は単なる例です。2 人は実際にどのキューを使用するかをどのように決定すればよいでしょうか?

ありがとう

4

4 に答える 4

2

実際には、オプション C をお勧めします。クラスを続行する前にデリゲートのアクティビティを完了する必要がある場合を除き、デリゲート コールバック専用のキューを用意します。その場合は、オプション A を使用します。

UI の更新が必要な場合、デリゲートはメイン キュー自体にディスパッチできますが、それを強制しないでください。

于 2013-04-21T17:04:25.600 に答える
1

クラスの init に delegateQueue 引数を追加することもできます。そうすれば、クラスのコンシューマにデリゲート呼び出しを起動するキューを完全に制御できます。

UI アクションはメイン キューで実行する必要があるという点で、他の回答は正しいです。ただし、消費するクラスにとって不要な場合に、クラスがデリゲート呼び出しをメイン キューに入れると無駄になります。

于 2014-05-11T11:06:17.853 に答える
1

これは、あなたと API ユーザーとの間の契約の問題だと思います。どちらのアプローチを選択する場合でも、API のユーザーはそれを知る必要があるため、それについて明示してください。

@andreagiavatto が正しく指摘したように、この決定の重要性は、UI の更新をメイン スレッドで行う必要があることです。また、コールバックまたは完了ハンドラーが常にメイン スレッドでキューに入れられるかどうかを明示的に述べていない場合、API のユーザーは、UI に関連する場合は、別の dispatch_async() でメイン スレッドにラップするために常に追加の手順を実行する必要があります。

あなたが API の唯一のユーザーである場合、明示的で一貫性があることは、ばかげた間違いを避けるのに役立ちます。

これが私がそれを行うために選択した方法です:

  1. 一般的なルールは、オプション Aとして、私のデリゲート コールバックが非同期で実行されているコードでインラインで呼び出されることです。
  2. デリゲート コールバックの目的が 99% で UI フィードバックを提供することである場合、オプション Bとしてメイン スレッドでそれらをキューに入れ、ヘッダー ファイルとドキュメントの両方でドキュメント化します。
于 2013-04-11T06:59:08.923 に答える