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


115

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

私はこのイベントスタックを使用して、TabBarタブ内の画像の属性を変更しましたが、1回のループですばやく実行できるように、最大​​10秒の変更をキューに入れる場合がありました。

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

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

私はこのクエリを過去形で書いています。なぜなら、再生機能にタカ目イベントフィルターを追加することで、この問題の代替ソリューションをすでに思いついたからです。でも、イベントのキャンセルが可能かどうかはまだ気になりますが、そういう知識は今後重宝すると思います。提供された支援に感謝します:)


どのようにして、再生機能でタカ目イベントフィルターを使用できますか?
Maniganda saravanan 2014年

回答:


241
[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:。説明の最後にあります。


33
使用方法については、次を試してみてください。[NSObject cancelPreviousPerformRequestsWithTarget:self];
dnstevenson 2011年

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(mySel :) object:nil];
webtrick101

2

以前のすべての実行リクエストをキャンセルするには、以下を使用できます。

[NSObject cancelPreviousPerformRequestsWithTarget:self];   

2

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

ああ、ああ、「マッチング」メソッドは次のとおりです。

performSelector

cancelPreviousPerformRequestsWithTarget

(ドキュメントを検索せずに覚えるのをさらに難しくするためだけです。)


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.