在NSRunLoop中取消NSTimer

时间:2012-08-13 01:02:31

标签: ios nstimer nsrunloop

我目前正在这样做:

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

如果在某个延迟(timeUntilAction)之后我应该如何设置方法(actionToPerform),但是在给定某些用户交互的情况下仍然能够取消操作。用户还应该能够在初始计时器(已取消的计时器)计划关闭之前重新启动计时器。

任何建议都会很棒!

由于

2 个答案:

答案 0 :(得分:3)

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

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(actionToPerform) object:nil]

答案 1 :(得分:1)

你可以在NSRunLoop中取消NSTimer。 即使您在NSTimer和NSRunloop中找不到API,也可以尝试使用CFRunLoop。 根据Apple here,请参阅:

首先,

docker-compose version 1.6.0, build d99cad6 Docker version 1.10.2, build c3959b1

然后,

CFRunLoopAddTimer

CFRunLoopRef *cfrl = [NSRunLoop getCFRunLoop];

CFRunLoopRemoveTimer

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

P.S。特别关于

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

请参阅Apple doc。 NSObject

  

特别注意事项

     

此方法向其当前上下文的runloop注册,并依赖于定期运行的runloop以正确执行。您可以调用此方法并最终使用不会自动定期运行的runloop注册的一个常见上下文是由调度队列调用。如果在调度队列上运行时需要此类功能,则应使用- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 及相关方法来获取所需的行为。

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