1

Cocoaでは、ユーザーがNSOperationQueueまたはdispath_queue_tのいずれかを非同期メソッドに渡すことができる場合があります。

+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
-[AVPlayer addBoundaryTimeObserverForTimes:queue:usingBlock:]
-[NSNotificationCenter addObserverForName:object:queue:usingBlock:]

時々しません:

-[NSDocument continueActivityUsingBlock:]
-[NSSavePanel beginWithCompletionHandler:]
-[GKAchievementDescription loadImageWithCompletionHandler:]

私には、ブロックを作成するときにいつでも目的のキューをキャッチできるため、メソッドにキューを渡すことはあいまいに見えます。例えば:

NSOperationQueue *q = …;
[aDocument continueActivityUsingBlock:^{
    [q addOperationWithBlock:^{
        // Do actual work here.
    }];
}];

多分私は何かが欠けていて、キューを渡すことは理にかなっていますか?

4

1 に答える 1

4

依存します。

完了時にコールバックが必要ですか?

その場合、キューを指定する必要があるかもしれません。タイプ(NSOperationQueueとGCDキュー)はあなた次第です。

ただし、コールバックを常にメインキューで呼び出されるように定義する場合(これは、常にUIを大幅に更新するコールバックに適しています)、または常に非同期で呼び出される場合(つまり、コールバックはにディスパッチされます)非同期キュー(通常)、ターゲットキューを渡す理由はありません。

コールバックが、操作をシリアル化する必要のあるデータと潜在的に相互作用することが予想されるコールバックである場合、シリアル化プリミティブ(キュー)を提供するAPIを定義することは強力なショートカットになります。

于 2012-10-28T04:59:56.270 に答える