从辅助线程启动NSTimer时出现问题

时间:2010-01-19 18:30:35

标签: iphone multithreading

我在我的代码中注意到,当我尝试从辅助线程启动NSTimer时,它不起作用。我试着调用+ [NSRunLoop currentRunLoop],以防问题是线程没有运行循环...但没有骰子。 (请注意,这是在黑暗中拍摄的。文档说这将创建一个运行循环,但也许还有其他配置,我需要做,但没有。)

我知道像[NSObject performSelectorOnMainThread:]这样的调用可以解决我的问题(事实上,我的解决方案是简单地将此代码移动到主线程中,这很好),但我仍然很好奇为什么会出现这个问题实际上不可能从辅助线程启动NSTimer吗?有解决方法吗?

非常感谢。

4 个答案:

答案 0 :(得分:2)

以下代码段适合我。

-(id)init {
    myWorkerThread = [[NSThread alloc]initWithTarget:self selector:@selector(workerThread) object:nil];
    [myWorkerThread start];
}

#pragma mark WorkerThread Support
-(void)stillWorking {
    NSLog(@"Still working...");
}

-(void)workerThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    NSTimer *threadTimer = [NSTimer scheduledTimerWithTimeInterval:10 
                                target:self
                              selector:@selector(stillWorking) 
                              userInfo:nil 
                               repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:threadTimer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    [pool drain];
}

答案 1 :(得分:1)

我发现此页面包含一些用于在辅助线程上启动NSTimer的源代码。你真的在代码中启动了runloop吗?如果没有看到您的代码可能会出现什么问题,很难说: http://www.iphonedevsdk.com/forum/iphone-sdk-development/22175-nstimer-secondary-thread-will-produce-leaks.html

答案 2 :(得分:1)

John Franklin的回答是正确的..但是当你调用方法时

scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:

它会自动安排当前NSRunLoop上的计时器。因此,您无需再次将计时器添加到当前运行循环,只能调用[[NSRunLoop currentRunLoop] run]方法。

答案 3 :(得分:0)

确保你A)将计时器添加到当前的runloop,B)运行所说的runloop。当您的计时器触发时,如果您想退出[runloop run]调用,请调用[runloop stop]。