web-dev-qa-db-ja.com

dispatch_after()メソッドをキャンセルしますか?

キャンセルする方法はありますかdispatch_after()将来しばらくの間予定されていて、まだ起動していませんか?サーバーからの更新のスケジューラのようなものを作成しようとしていますが、この方法は私が望むものと同じですが、いつかキャンセルして再スケジュールしたいと思います。まったく可能ですか、またはフォールバックしてNSTimerを使用する必要がありますか?

29
Oleg Shanyuk

キューへのディスパッチが完了すると、dispatch_blockが実行されないようにする方法はありません。つまり、dispatch_afterをキャンセルすることはできません。唯一のオプションは、実行を防ぐために実行時にチェックする条件をブロックに追加することです。すなわち。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(), ^ {
if(self.shouldExecuteDispatchBlock)
{ // do your stuff }  });
24
Florian Burel

わかりました。したがって、すべての回答が収集され、考えられる解決策は、この場合に最適なもの(単純さを維持する)がperformSelector:withObject:afterDelay:を呼び出し、必要に応じてcancelPreviousPerformRequestsWithTarget:呼び出しでキャンセルすることです。私の場合-次の遅延通話をスケジュールする直前:

[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self];

[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay];
16
Oleg Shanyuk

この目的のために、このクラスを使用しました:

https://github.com/SebastienThiebaud/dispatch_cancelable_block

cancel()関数を呼び出して、ブロック内にあるものの実行を取り消すことができます。

6
Zoltan Varadi

ディスパッチタイマーソースを使用する(つまりdispatch_afterとにかく内部的に使用します)。

ディスパッチタイマーソースは、作成後にキャンセルするか、タイマーパラメーターを変更できます。

1
das