performSelector:withObject:afterDelay
を呼び出すときに、イベントスタックまたはタイマースタック(またはAPIによって使用されるメカニズム)から既にキューに入れられているセレクターイベントをキャンセルできるかどうかを誰かが知っていますか?
このイベントスタックを使用して、TabBarタブ内の画像の属性を変更していましたが、ループのためにすばやく実行された場合、最大10秒の変更をキューに入れることがありました(5ミリ秒程度)。
ユーザーがタブを切り替えると問題が発生します。たとえば、Tab#4が有効になるとすぐに表示される画像の画像変更がキューに入れられ、ユーザーはすぐにTab#3に切り替えてからTabに戻る#4 ...これは、古いキューがまだ再生されている間に、さらに10秒の変更を再キューイングします。おそらく十分に速く切り替えられた場合、キューに約2または3秒で入ってきます...ストリームに問題がありました。
そのため、新しいスタックを配置する前に、変更の古いスタックをキャンセルする方法が必要でした...
再生機能に鷹の目イベントフィルターを追加することにより、この問題の代替ソリューションを既に考え出したため、過去時制でこのクエリを記述しています。しかし、イベントのキャンセルが可能かどうかはまだ興味があります。将来そのような知識が役立つと思うからです。提供された支援に感謝します:)
[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:
の説明の最後にあります。
以前のすべての実行要求をキャンセルするには、次を使用できます。
[NSObject cancelPreviousPerformRequestsWithTarget:self];
一致する「cancelPreviousPerformSelector
」を持つ「performSelector」を探している場合は、そうではありません。 (うーん、アップル、なぜ私にそうするのですか?)
「一致」メソッドは次のとおりです。
performSelector
cancelPreviousPerformRequestsWithTarget
(ドキュメントを検索せずに、覚えるのをさらに難しくします。)
NSRunLoopのドキュメントを確認してください。 -cancelPerformSelectorsWithTarget: