2013-02-21 1 views
9

更新操作を処理するキューブロックを再スケジュールしようとしています。 主な目標は、最小量(UI更新要求)のUIオブジェクト(オンラインユーザーテーブル...)を更新することです。 (サーバーは時々イェーイ、アップデートの膨大な量をダウン雨!)GCDディスパッチキューからキューブロックを削除するには?

をメインシナリオがある簡単にするために、

  • dispatch_queue_tインスタンス(所与のUI更新ブロックを処理するキュー)がシリアルディスパッチキュー(プライベートディスパッチキュー)

  • 操作(UI更新ブロック)のT量でdispatch_afterでスケジュールされています(データセット更新ごとに更新するのではなく、時間内に更新要求を収集して1回のUI更新を実行する)

  • データセットが更新された場合、スケジュールされたイベントが既に存在するかどうかを確認します。はいの場合は、dispatch_queue_tインスタンスからスケジューリングを解除します。次に、時間遅延のある同じブロックを再スケジュールします。

また、

tはユーザーが気付かないほどの時間間隔です(500 msなど)。 代替方法は歓迎します。この背後にある

私の動機。

私はAndroidのハンドラを使って同じロジックを適用しました(& removeCallbacksとRunnableインスタンスの組み合わせ)。私はiOSでも同じことができたらいいと思います。

編集:

@Svenは、彼らがそれぞれNSOperationをキャンセルサポートするようNSOperationQueueの使用量は、シナリオに適している示唆したように。私は書類を見て見つけた。操作 キャンセル

一旦操作キューに追加し、操作対象を効果的キューによって所有されており、削除することができません。操作をデキューする唯一の方法は、操作を取り消すことです。 あなたはその方法をキャンセルしたり、キューオブジェクトのcancelAllOperationsメソッドを呼び出すことによって、キュー内の操作オブジェクトのすべてをキャンセルすることができます呼び出すことにより、単一の、個々の操作対象をキャンセルすることができます。

あなたは、あなたは、もはやそれらを必要と確信している場合にのみ、操作をキャンセルする必要があります。 cancelコマンドを実行すると、操作オブジェクトは「キャンセル」状態になり、実行されることはありません。キャンセルされた操作は依然として「終了」と見なされるため、依存関係にあるオブジェクトは、その依存関係をクリアするために適切なKVO通知を受け取ります。したがって、アプリケーションを選択的にキャンセルするのではなく、アプリケーションが終了するか、またはユーザーが特に取り消しを要求するなど、重要なイベントに応答して、キューに入れられたすべての操作をキャンセルする方が一般的です。

答えて

7

あなたは、ディスパッチキューに登録操作を削除するか、そうでなければ変更することはできません。代わりにキャンセルをサポートする上位レベルNSOperationQueueを使用してみてください。

+0

私はいつも彼らが重くAFNetworkingフレームワークで使用されているようNSOperationQueueのを見てみたかったです。ありがとうございます、可能であれば、私は一見としてマークします。 –

13

これは簡単に、同様GCDとここNSOperationQueueある大きなハンマーのために到達するための必要性を全く行われないことができます。

dispatch_afterの代わりに、非繰り返しのディスパッチタイマーソースを直接使用するだけです(これは、そのようなタイマーソースを囲む便利なラッパーであり、タイマーがオフになるまで実際にブロックをキューにエンキューしません)。

あなたはdispatch_source_set_timer()と保留中のタイマソースの実行を再スケジュールすることができます。

+1

'NSOperationQueue'はGCDキューのまわりのObjective-Cラッパーです。なぜそれが_ "大きなハンマー" _だと思いますか?それは私にとっても簡単なインターフェースを持っているので、私はそれを好む。 – Tricertops

+11

これは間違っています。 NSOperationQueueはGCDラッパーではなく、非常に複雑なキューイング、依存関係、優先順位追跡システムであり、GCDとは完全に別に実装されています。それは一度の操作を実行するために最後にグローバル同時キューに)(これは、(スピンロックとミューテックスと一緒に)いくつかの同期のために内部GCDを使用していますが、クライアントのコードの実行の面でGCDへの唯一の接続はNSOperationQueueがdispatch_asyncを行うということですそうする準備ができている。このような複雑さと柔軟性はすべてコストがかかりますが、NSOperationQueueは単純な操作ではGCDよりも1000秒遅いです。 – das

+5

NSOperationは、KVOおよびGCDプリミティブを使用してキュー内の依存関係を管理するGCDの上位レベルの並行処理ラッパーです。 QA1712、NSOperationQueueクラスリファレンス、並行処理プログラミングガイドにはすべてこれが言及されています。 NSOperationsは、単純な操作(つまりaddOperationWithBlock)ではGCDよりも遅い「1000秒」であってはなりません。そうであれば、あなたは何か別のことをしています。 – quellish

関連する問題