2012-08-16 8 views
14

NSOperationQueueに挿入された実行中のNSOperationを一時停止する必要があります。現在、私はすべての操作を取り消して再起動しています。しかし、これは、行われたプロセスの面で何らかの重複を招くことになります。 NSOperationQueueのsetSuspendedフラグで試しました。しかし、それは操作を中断していません。脱出はありますか?NSOperationQueueでNSOperationを一時停止するにはどうすればよいですか?

答えて

10

この参照してください。あなたが操作の実行に一時停止を発行する場合は、対応する操作キューを一時停止することができます

キュー の中断と再開:apple docsからLink

そして、ここにsetSuspended:メソッドを使用します。

キューをサスペンドしても、実行中の操作がタスクの途中で一時停止することはありません。新しいオペレーションの実行がスケジュールされないようにするだけです。ユーザが最終的にその作業を再開したいと考えているため、進行中の作業を一時停止するというユーザの要求に応じて、キューを一時停止することがあります。

+0

ありがとうございます!あなたのリンクから実装しようとしました。 NSOperation内に 'isPaused'という新しい変数を追加しました。操作を一時停止する必要があるときはいつでも、値をYESに設定します。 NSOperationの中で私は定期的に 'isPaused'の値をチェックします。私が「はい」と感じるたびに、私はループから抜け出すでしょう。しかし、私はここで深刻な問題があります。私は 'isPaused'の値をメインスレッドから設定しようとしています。これはいくつかの競合状態につながる可能性があります。競争条件を取り除く方法はありますか?メインスレッドではなく、同じスレッドでメソッドを呼び出す方法はありますか? – Advaith

+1

@Advaith:両方のスレッドが 'isPaused'の読み書きの前にミューテックスをロックすると、レースについて心配する必要はありません。 –

3

私はこれを試していないが、私はおそらくここから始めます:

  • があなたのNSOperationサブクラス
  • isPausedフラグを追加し、操作のデータのコピー/移動方法を実装
  • -mainでこの変更を監視)
  • 一時停止操作から新しい操作に状態を移動する新しい操作を作成
  • あなたは
  • が好きなら、キュー内の演算順序を並べ替えるために優先順位を調整-main

であれば-mainからキュー

  • リターンにクローンを追加し、これはちょうどそれを中断することに注意してください。一時停止して明示的に再開したい場合は、再開するときに手動で「新しい操作」を行います。

    今、あなたが観察している、または特別な完了をしている場合は、他にもいくつか問題があります。単純なケースでは、このアプローチはうまくいくようです。

  • 関連する問題