为什么我的CFRunLoopTimer没有开火?

时间:2013-05-02 14:20:46

标签: c++ ios objective-c cocoa core-foundation

我在C ++类中创建了CFRunLoopTimer,如下所示:

#import <CoreFoundation/CoreFoundation.h>

void cClass::StartTimer()
{      
  if(!mActiveSenseTimer)
  {
    CFTimeInterval TIMER_INTERVAL = 5;
    CFRunLoopTimerContext TimerContext = {0, this, NULL, NULL, NULL};
    CFAbsoluteTime FireTime = CFAbsoluteTimeGetCurrent() + TIMER_INTERVAL;
    mTimer = CFRunLoopTimerCreate(kCFAllocatorDefault,
                                  FireTime,
                                  0, 0, 0,
                                  ActiveSenseTimerCallback,
                                  &TimerContext);

    NSLog(@"RunLoop:0x%x, TimerIsValid:%d, TimeIsNow:%f, TimerWillFireAt:%f",
          CFRunLoopGetCurrent(),
          CFRunLoopTimerIsValid(mActiveSenseTimer),
          CFAbsoluteTimeGetCurrent(),
          FireTime);
  }
}

void ActiveSenseTimerCallback(CFRunLoopTimerRef timer, void *info)
{
  NSLog(@"Timeout");
  CFRunLoopTimerContext TimerContext;
  TimerContext.version = 0;

  CFRunLoopTimerGetContext(timer, &TimerContext);
  ((cClass *)TimerContext.info)->Timeout();
}

调用cClass::StartTimer()会产生以下日志输出:

  

RunLoop:0x7655d60,TimerIsValid:1,TimeIsNow:389196910.537962,TimerWillFireAt:389196915.537956

然而,我的计时器永远不会开火。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

来自docs

的引用
  

计时器需要在激活之前添加到运行循环模式。要将计时器添加到运行循环,请使用CFRunLoopAddTimer。计时器一次只能注册到一个运行循环,尽管它可以在该运行循环中处于多种模式。

还要确保在计时器触发之前你的运行循环不会消失。