(iphone)哪一个更精确的时间:performSelector:afterDelay vs NSTimer

时间:2011-02-07 05:08:50

标签: iphone nstimer nsthread

我正在使用performSelector执行动画:withObject:afterDelay at 24fps (原因是,UIImageView不支持图像之间的不同间隔)
当我同时运行多个动画时,看起来像performselector排队的消息需要很长时间才能被拾取。

我想知道NSTimer还是另一个会是更好的选择。

谢谢

  • EDIT

除了运行动画之外,我什么都没做 我正在运行的选择器占用0.0003次。(几乎没有时间)
但是当我测量调用“performSelector”和选择器实际被调用的时间之间的时间时,实际上比我在“afterDelay”或“scheduledTimerWithDuration”中指定的时间更长

我已经查看了仪器,但无法弄清楚是什么导致延迟 我刚看到线程相关(我猜线程暂停/恢复)活动很多 也许我的下面的threadMain代码占用了很多时间?

- (void) myThreadMain
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // Add your sources or timers to the run loop and do any other setup.                                                                                                                                                                                                     
    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

    do
    {
        // Start the run loop but return after each source is handled.                                                                                                                                                                                                        
        SInt32    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);

    }
    while (self.isNeedToExit == false);

    [pool release];

    SYSLOG(LOG_DEBUG, "thread exiting");
}

2 个答案:

答案 0 :(得分:5)

Apple说:

  

此方法[performSelector:withObject:afterDelay:]设置一个计时器,以在当前线程的运行循环上执行aSelector消息。

所以他们都做同样的事情。你的罪魁祸首在别处。

顺便说一句,你可能想看看CADisplayLink。它是一个专门的计时器,以与屏幕刷新率相同的频率发射,专门用于你想要的声音。

答案 1 :(得分:2)

由于所有选择器/方法共享一个CPU和一个运行循环(UI运行循环,除非您另行指定),如果进行太多操作,定时器和延迟选择器将被延迟调用。你需要描述你的应用程序(工具),看看是什么占用了时间,从而使其他事情迟到。