将performSelector:withObject:afterDelay:工作时间不到1秒?

时间:2013-06-28 18:55:24

标签: objective-c nstimer performselector

虽然你可以传递亚秒级的次数来执行Session:withObject:afterDelay:,但是看起来定时器会在1秒内以任何延迟的速度发射。例如,如果我将延迟设置为100毫秒(0.100)或10毫秒(0.010),则计时器仍将在2或3毫秒内启动。这是一个已知的限制吗?

对于performSelection:withObject:afterDelay:,延迟文档为:

  

延迟 - 发送消息的最短时间。指定延迟0不一定会导致选择器立即执行。选择器仍然在线程的运行循环中排队,并尽快执行。

将此与NSTimer进行比较,其中文档为:

  

seconds - 计时器启动之间的秒数。如果seconds小于或等于0.0,则此方法选择非负值0.1毫秒。

当提供负值时,似乎performSelector:withObject:afterDelay:使用其延迟设置,就像NSTimer的秒设置一样。

任何人都可以确认这是正确的吗?

2 个答案:

答案 0 :(得分:0)

如果使用performSelector:withObject:afterDelay:将延迟设置为100毫秒(0.100),则不会在2或3毫秒内触发。它将在100毫秒后安排在runloop上,并等到runloop有机会执行。所以它可能会在102或103毫秒后发射。

答案 1 :(得分:0)

作为后续行动,我发现performSelector:withObject:afterDelay:工作得很好,并且它没有在亚秒间隔触发,因为我传递的int延迟时间如下:< / p>

int delay = 0.025; // 25 msec
[self performSelector:@selector(blahBlah:) withObject:nil afterDelay:delay];
好的,我的坏!然而,这导致另一个观察 - 我认为编译器在没有显式强制转换的情况下将double转换为int时会报告“精度损失”。但事实并非如此。小心!