1

从另一个线程调用 setFireDate: 是否被认为是线程安全的,而不是调度定时器的线程?我的意思是,我在一个新线程中分离了这个函数:

-(void)CFRunLoopTest {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];

    runLoop = CFRunLoopGetCurrent();

    CFRunLoopAddTimer(runLoop, (CFRunLoopTimerRef)timer, kCFRunLoopCommonModes);

    CFRunLoopRun();
    [pool drain];
}

[timer setFireDate:]可以从主线程调用吗?我在文档中没有发现任何禁止它的东西......

4

2 回答 2

3

NSTimer方法参考中的注释setFireDate:

您可能会在尚未触发的非重复计时器上调用此方法,但您应该始终 从连接计时器的线程执行此操作以避免潜在的竞争条件。

另请查看以下 讨论是否有帮助。

于 2011-05-26T11:47:33.710 回答
2

为什么不在主线程上运行计时器?我不明白为什么您需要在单独的线程中运行它。您总是可以使用 timerFireMethod:如果它消耗大量时间,则生成一个新线程,只需使用performSelectorInBackground:withObject:.

编辑:所以文档实际上说[timer setFireDate:]从另一个线程调用不是线程安全的。但是,我的建议仍然有效。

于 2011-05-26T11:48:33.490 回答