1. ホーム
  2. objective-c

[解決済み] キューに入れられたperformSelector:afterDelayの呼び出しをキャンセルする

2022-08-27 18:39:39

質問

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

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

たとえば、タブ #4 が有効になるとすぐに表示される画像の変更をキューに入れ、その後、ユーザーがすばやくタブ #3 に切り替え、すぐにタブ #4 に戻るとします。

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

私はこのクエリを過去形で書いています。なぜなら、再生関数に鷹の目のイベントフィルターを追加することによって、この問題に対する代替ソリューションをすでに考え出したからです。しかし、私はまだイベントキャンセルが可能かどうかに興味があります。)

どのように解決するのですか?

[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: の記述の最後にあります。