我目前正在这样做:
timer = [NSTimer timerWithTimeInterval:timeUntilAction target:self selector:@selector(actionToPerform) userInfo:nil repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];
但我希望能够使该计时器无效。调用invalidate似乎没有做任何事情,我不知道还有什么可以尝试,因为我无法从NSRunLoop
中删除我可以看到NSTimer
或NSRunLoop
。
如果在某个延迟(timeUntilAction)之后我应该如何设置方法(actionToPerform),但是在给定某些用户交互的情况下仍然能够取消操作。用户还应该能够在初始计时器(已取消的计时器)计划关闭之前重新启动计时器。
任何建议都会很棒!
由于
答案 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 。