1

を使用して、いくつかのバックグラウンド ネットワーク リクエストを実装したいと考えていますNSOperationQueue。コードのさまざまな部分によってキューに追加されるいくつかの異なる要求があり、そのうちの 1 つは他の要求よりも定期的に実行されます。

私はすでに GCD を使用してこれを実装しているため、コードのブロックがあるため、単にNSBlockOperationメソッドblockOperationWithBlock:^{...}を使用し、 のサブクラスを作成しないことを計画していましNSOperationた。

この問題は、リクエスト間に依存関係を作成したいということです。キューにすでに requestA がある場合は、requestBNSBlockOperationを作成するときに依存関係を追加します。NSBlockOperation操作を同時に作成する場合、これは些細なことですが、どの操作がキューに既に存在するかを判断する簡単な方法が見つかりません。

NSOperationQueueにはoperationsプロパティがあるので、操作自体のリストを取得できますが、どの操作がどれであるかを判断するにはどうすればよいでしょうか? 使用できる名前/説明プロパティが表示されません。

私が考えることができるオプションは次のとおりです。

  1. サブクラス化NSOperationしてリクエスト タイプごとにカスタム オブジェクトを作成し、operationsプロパティから取得したオブジェクトに対してイントロスペクションを使用します
  2. サブクラスNSBlockOperation化して説明プロパティを追加する

これを行うための他の明らかな方法がありませんか?

4

3 に答える 3

2

最新のrequestA操作を保持するインスタンス変数を追加します。requestAブロックの終わりでそれをクリアします。例えば

_requestA = [NSBlockOperation blockOperationWithBlock:^{
    // Normal requestA code here.
    // ...

    // Assuming you create all requestA and requestB instances on the main thread...
    dispatch_async(dispatch_get_main_queue(), ^{ _requestA = nil; });
}];

次に、を作成するときに、使用するものがまだある場合は、依存関係としてrequestB最新のものを指定できます。requestA

于 2012-10-18T21:42:11.517 に答える
1

優先順位を使用できます。

[NSBlockOperation setPriority:NSOperationQueuePriority]

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

次に、操作を列挙するときに、優先度レベルを確認し、それらを依存関係として追加するかどうかを確認できます。それらを確認する必要さえなく、操作の優先度レベルを適切に設定するだけです。

于 2012-10-18T21:35:26.717 に答える