首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NSRunLoop中取消NSTimer

在NSRunLoop中取消NSTimer
EN

Stack Overflow用户
提问于 2012-08-13 09:02:31
回答 2查看 3.4K关注 0票数 0

我目前正在这样做:

代码语言:javascript
复制
timer = [NSTimer timerWithTimeInterval:timeUntilAction target:self selector:@selector(actionToPerform) userInfo:nil repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];

但我希望能够使该计时器失效。调用invalidate似乎没有任何作用,我不知道还可以尝试什么,因为我不能从NSTimerNSRunLoop的任何实例方法的NSRunLoop中删除计时器。

我应该如何将一个方法(actionToPerform)设置为在特定延迟(timeUntilAction)后触发,但在给定特定用户交互的情况下仍具有取消操作的能力。用户还应该能够在初始计时器(被取消的计时器)被安排到计时器之前重新启动计时器。

任何建议都是很棒的!

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-13 10:19:18

代码语言:javascript
复制
[self performSelector:@selector(actionToPerform) withObject:nil afterDelay:timeUntilAction]

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(actionToPerform) object:nil]
票数 3
EN

Stack Overflow用户

发布于 2016-02-26 23:39:26

您可以在NSRunLoop中取消NSTimer。即使您在NSTimer或NSRunloop中找不到API,您也可以尝试CFRunLoop。根据苹果here的说法,看看是怎么回事:

第一,

CFRunLoopRef *cfrl = [NSRunLoop getCFRunLoop];

然后,

CFRunLoopAddTimer

代码语言:javascript
复制
void CFRunLoopAddTimer ( CFRunLoopRef rl, CFRunLoopTimerRef timer, CFStringRef mode );

CFRunLoopRemoveTimer

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11927126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档