web-dev-qa-db-ja.com

キューに入れられたperformSelector:afterDelay呼び出しをキャンセルする

performSelector:withObject:afterDelayを呼び出すときに、イベントスタックまたはタイマースタック(またはAPIによって使用されるメカニズム)から既にキューに入れられているセレクターイベントをキャンセルできるかどうかを誰かが知っていますか?

このイベントスタックを使用して、TabBarタブ内の画像の属性を変更していましたが、ループのためにすばやく実行された場合、最大10秒の変更をキューに入れることがありました(5ミリ秒程度)。

ユーザーがタブを切り替えると問題が発生します。たとえば、Tab#4が有効になるとすぐに表示される画像の画像変更がキューに入れられ、ユーザーはすぐにTab#3に切り替えてからTabに戻る#4 ...これは、古いキューがまだ再生されている間に、さらに10秒の変更を再キューイングします。おそらく十分に速く切り替えられた場合、キューに約2または3秒で入ってきます...ストリームに問題がありました。

そのため、新しいスタックを配置する前に、変更の古いスタックをキャンセルする方法が必要でした...

再生機能に鷹の目イベントフィルターを追加することにより、この問題の代替ソリューションを既に考え出したため、過去時制でこのクエリを記述しています。しかし、イベントのキャンセルが可能かどうかはまだ興味があります。将来そのような知識が役立つと思うからです。提供された支援に感謝します:)

114
eerok512
[NSObject cancelPreviousPerformRequestsWithTarget:]

または

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

targetは、performSelector:afterDelay:が呼び出された元のオブジェクトです。

例えば:

// schedule the selector
[self performSelector:@selector(mySel:) withObject:nil afterDelay:5.0];
// cancel the above call (and any others on self)
[NSObject cancelPreviousPerformRequestsWithTarget:self];

Apple docs を参照してください。performSelector:withObject:afterDelay:の説明の最後にあります。

238
stefanB

以前のすべての実行要求をキャンセルするには、次を使用できます。

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
2
Marco Mirisola

一致する「cancelPreviousPerformSelector」を持つ「performSelector」を探している場合は、そうではありません。 (うーん、アップル、なぜ私にそうするのですか?)

「一致」メソッドは次のとおりです。

performSelector

cancelPreviousPerformRequestsWithTarget

(ドキュメントを検索せずに、覚えるのをさらに難しくします。)

2
Irene

NSRunLoopのドキュメントを確認してください。 -cancelPerformSelectorsWithTarget:

1
NSResponder