我在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
然而,我的计时器永远不会开火。有什么想法吗?
答案 0 :(得分:4)
来自docs
的引用计时器需要在激活之前添加到运行循环模式。要将计时器添加到运行循环,请使用CFRunLoopAddTimer。计时器一次只能注册到一个运行循环,尽管它可以在该运行循环中处于多种模式。
还要确保在计时器触发之前你的运行循环不会消失。