118

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

このイベントスタックを使用して、TabBarタブ内の画像の属性を変更していましたが、1回の高速実行forループで最大10秒に相当する変更をキューに入れることがありました...おそらく5ミリ秒程度です。

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

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

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

4

4 に答える 4

245
[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];

アップルのドキュメントを参照してください。説明の最後にありperformSelector:withObject:afterDelay:ます。

于 2009-11-27T02:40:29.973 に答える
2

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

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

performSelector

cancelPreviousPerformRequestsWithTarget

(ドキュメントを検索せずに、覚えにくくするためだけに。)

于 2011-02-08T17:41:08.800 に答える
2

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

[NSObject cancelPreviousPerformRequestsWithTarget:self];   
于 2013-07-30T12:38:52.050 に答える
1

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

于 2009-11-27T02:47:31.017 に答える