我目前正在这样做:
timer = [NSTimer timerWithTimeInterval:timeUntilAction target:self selector:@selector(actionToPerform) userInfo:nil repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];但我希望能够使该计时器失效。调用invalidate似乎没有任何作用,我不知道还可以尝试什么,因为我不能从NSTimer或NSRunLoop的任何实例方法的NSRunLoop中删除计时器。
我应该如何将一个方法(actionToPerform)设置为在特定延迟(timeUntilAction)后触发,但在给定特定用户交互的情况下仍具有取消操作的能力。用户还应该能够在初始计时器(被取消的计时器)被安排到计时器之前重新启动计时器。
任何建议都是很棒的!
谢谢
发布于 2012-08-13 10:19:18
[self performSelector:@selector(actionToPerform) withObject:nil afterDelay:timeUntilAction]
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(actionToPerform) object:nil]发布于 2016-02-26 23:39:26
您可以在NSRunLoop中取消NSTimer。即使您在NSTimer或NSRunloop中找不到API,您也可以尝试CFRunLoop。根据苹果here的说法,看看是怎么回事:
第一,
CFRunLoopRef *cfrl = [NSRunLoop getCFRunLoop];
然后,
CFRunLoopAddTimer
void CFRunLoopAddTimer ( CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode );CFRunLoopRemoveTimer
void CFRunLoopRemoveTimer ( CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode );附注:尤其是关于
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
请参阅Apple文档。对于NSObject
特殊注意事项
此方法向其当前上下文的runloop注册,并依赖于定期运行的runloop才能正确执行。当调度队列调用时,您可能会调用此方法并最终注册到不会定期自动运行的runloop,这是一个常见的上下文。如果在调度队列上运行时需要这种类型的功能,则应该使用dispatch_after和相关方法来获得所需的行为。
此外,您还可以在GitHub上使用MSWeakTimer。
https://stackoverflow.com/questions/11927126
复制相似问题