0

私は現在これをやっています:

timer = [NSTimer timerWithTimeInterval:timeUntilAction target:self selector:@selector(actionToPerform) userInfo:nil repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];

しかし、そのタイマーを無効にしたいと思います。invalidate を呼び出しても何も起こらないようで、他に何を試せばよいかわかりません。または で確認できるインスタンス メソッドからタイマーを削除できないためNSRunLoopです。NSTimerNSRunLoop

メソッド (actionToPerform) を特定の遅延 (timeUntilAction) の後に起動するように設定する方法を教えてください。ただし、特定のユーザー インタラクションが与えられた場合、アクションをキャンセルする機能はまだあります。また、ユーザーは、最初のタイマー (キャンセルされたタイマー) がオフになるようにスケジュールされる前に、タイマーを再開できる必要があります。

どんな提案も素晴らしいでしょう!

ありがとう

4

2 に答える 2

3
[self performSelector:@selector(actionToPerform) withObject:nil afterDelay:timeUntilAction]

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(actionToPerform) object:nil]
于 2012-08-13T02:19:17.677 に答える
1

NSRunLoop で NSTimer をキャンセルできます。NSTimer や NSRunloop 内に API が見つからない場合でも、CFRunLoop を試すことができます。Apple によると、ここで、方法を参照してください。

初め、

CFRunLoopRef *cfrl = [NSRunLoop getCFRunLoop];

それで、

CFRunLoopAddTimer

void CFRunLoopAddTimer ( CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode );

CFRunLoopRemoveTimer

void CFRunLoopRemoveTimer ( CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode );

PS 特にについて

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

アップルのドキュメントを参照してください。NSObjectの場合

特別な考慮事項

このメソッドは、現在のコンテキストの実行ループに登録し、正常に実行するためにその実行ループが定期的に実行されることに依存します。このメソッドを呼び出して、定期的に自動的に実行されないランループに登録する可能性のある一般的なコンテキストの 1 つは、ディスパッチ キューによって呼び出されたときです。ディスパッチ キューで実行するときにこのタイプの機能が必要な場合は、dispatch_afterおよび関連するメソッドを使用して、必要な動作を取得する必要があります。

また、GitHub でMSWeakTimerを使用できます。

于 2016-02-26T15:39:26.210 に答える