2017-06-20 9 views
1

私は非同期タスクを実行したいので、タスクが要求されるたびにこれまでのすべてのタスクを廃止する必要があります。つまり、一度に1つのタスクしか実行せず、新しいタスクが開始されたときに前のタスクをキャンセルしたいということです。一度に1つのディスパッチタスクを実行し、新しいタスクが開始されたときに現在のキャンセルをキャンセルします。

例:

ユーザー何かを計算するためのボタンを押します。ユーザーが入力データを変更してボタンをもう一度押すと、コントローラーが計算します。最初の計算は取り消され、新しい計算は新しい入力から開始する必要があります。

このパターンは妥当ですか?これを実装する一般的なパターンは何ですか?これはDispatchQueue/OperationQueueに直接マッピングされていますか?

答えて

1

NSOperationNSOperationQueue(特にits cancelAllOperations method)を見てください。私はあなたのユースケースが収集したものから、おそらくNSOperation(具体的なサブクラス)にタスクをカプセル化し、それをキャンセルすることを含めてNSOperationQueueを使用して管理することができます。

+0

ありがとうございます、私はそれをチェックアウトします!現実世界の人々は、通常どのようにこのようなユースケースを処理しますか?ネットワーク/ローカルのバックグラウンドタスクを行うチュートリアルやブログ記事を読むと、コンテキストが変わったときにタスクを無効にすることはないようです。私は非同期を誤解しているかもしれませんが、2つのリクエストを続けて実行しても、メインスレッドで応答の順序が保証されません。これは、最初の不要なリクエストが2番目のリクエストよりも遅れて到着し、UIが間違ったデータを表示する可能性があることを意味します。取り消しが正しいアプローチになるのは間違いないでしょうか? – tombardey

+1

@tombardeyリソースを大量に消費して時間を費やすようなことをしているのであれば、古い入力が新しい入力に対して全く無意味であると仮定して、入力をやり直す前にキャンセルすることをお勧めします間違った出力よりも優れています)。非同期リクエストでは何も保証されていませんが、ユースケースはさまざまです。バックグラウンドタスクを実行するのに必要なリソースはほとんどなく、人々はそれを心配しません。 – Aehmlo

関連する問題