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我可以看到的任何实例方法中删除计时器NSTimeror NSRunLoop

我应该如何设置一个方法(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 here,看看如何:

第一的,

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

特别注意事项

此方法向其当前上下文的 runloop 注册,并依赖于该 runloop 定期运行以正确执行。您可能会调用此方法并最终注册到一个不会定期自动运行的 runloop 的一个常见上下文是当被调度队列调用时。如果您在调度队列上运行时需要这种类型的功能,您应该使用dispatch_after和相关的方法来获得您想要的行为。

此外,您可以在 GitHub 上使用MSWeakTimer

于 2016-02-26T15:39:26.210 回答