NSTimer 和 NSInvocation,定时器不触发

Posted

技术标签:

【中文标题】NSTimer 和 NSInvocation,定时器不触发【英文标题】:NSTimer and NSInvocation, timer does not fire 【发布时间】:2013-07-12 20:12:31 【问题描述】:

首先我创建一个NSInvocation,因为我想用定时器调用的方法有几个参数,我在这里设置了

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(addStockPriceForArticle:forInterval:)]];
[invocation setArgument:&varArticle atIndex:2];
NSNumber *interval = [NSNumber numberWithInt:60];
[invocation setArgument:&interval atIndex:3];

文档说设置参数时从索引 2 开始,因为索引 0 和 1 是目标和选择器。

然后我计算出我希望计时器的间隔。在这种情况下,我在文章发表 60 分钟后调用计时器,因此间隔为 60 - timeSincePubDate 以分钟为单位,我将其乘以 60 为计时器的间隔(以秒为单位)。

int timeUntilCheck = (60-timeSincePubDate)*60;

然后我创建带有间隔的计时器并将其添加到运行循环中。我以前从未这样做过,但这似乎很简单;我不确定为什么它从来没有调用它应该调用的方法。

[[NSRunLoop currentRunLoop] addTimer:[NSTimer timerWithTimeInterval:timeUntilCheck invocation:invocation repeats:NO]
                                     forMode:NSDefaultRunLoopMode];

【问题讨论】:

你是在主线程上做这个吗? Xcode 告诉我它正在线程 5 com.apple.root.default-priority 上完成。我想这是因为这是响应 RSS 提要的异步 html 请求而发生的 【参考方案1】:

您需要将计时器添加到 a) 存在且 b) 正在运行的运行循环中,否则它将永远不会触发,并且您可能希望回调发生在主线程上。

像这样将计时器添加到主线程的运行循环中:

[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:timeUntilCheck invocation:invocation repeats:NO]
                             forMode:NSDefaultRunLoopMode];

【讨论】:

以上是关于NSTimer 和 NSInvocation,定时器不触发的主要内容,如果未能解决你的问题,请参考以下文章

定时器(NSTimer scheduledTimerWithTimeInternval)和蓝牙委托:CBPeripheralDelegate 不适用于 NSTimer

在非主线程里面使用NSTimer创建和取消定时任务

runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器

swift - 封装 GCDTimer 和 NSTimer

iOS NSTimer定时器

iOS NSTimer定时器