更新操作を処理するキューブロックを再スケジュールしようとしています。 主な目標は、最小量(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通知を受け取ります。したがって、アプリケーションを選択的にキャンセルするのではなく、アプリケーションが終了するか、またはユーザーが特に取り消しを要求するなど、重要なイベントに応答して、キューに入れられたすべての操作をキャンセルする方が一般的です。
私はいつも彼らが重くAFNetworkingフレームワークで使用されているようNSOperationQueueのを見てみたかったです。ありがとうございます、可能であれば、私は一見としてマークします。 –