1

尽管您可以将亚秒级的时间传递给 performSelector:withObject:afterDelay:,但对于 1 秒以下的任何延迟,计时器似乎会尽快触发。例如,如果我将延迟设置为 100 毫秒 (0.100) 或 10 毫秒 (0.010),计时器仍将在 2 或 3 毫秒内触发。这是一个已知的限制吗?

对于 performSelection:withObject:afterDelay:,延迟的文档如下:

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

将此与 NSTimer 进行比较,文档中的内容如下:

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

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

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

4

2 回答 2

1

作为后续行动,我发现它performSelector:withObject:afterDelay:工作得很好,并且它没有以亚秒的间隔触发,因为我给它传递了一个int延迟,如下所示:

int delay = 0.025; // 25 msec
[self performSelector:@selector(blahBlah:) withObject:nil afterDelay:delay];

好吧,我的坏!然而,这导致了另一个观察结果——我认为编译器在将 a 转换double为 an时会报告“精度损失”,int而无需显式强制转换。但是,事实并非如此。谨防!

于 2013-06-29T01:08:37.323 回答
0

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

于 2013-06-28T19:15:17.937 回答