根据Run Loop的文档,如果有任何输入源,NSThread将在运行,否则它将进入睡眠状态。我配置的计时器与上面链接中“配置计时器源”下提供的计时器相同,但未触发。我正在使用下面的代码。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[NSThread detachNewThreadSelector:@selector(testOnThread) toTarget:self withObject:nil];
}
- (void) testThread
{
NSLog(@"Test");
}
-(void)testOnThread
{
@autoreleasepool {
NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop];
// Create and schedule the first timer.
NSDate* futureDate = [NSDate dateWithTimeIntervalSinceNow:1.0];
NSTimer* myTimer = [[NSTimer alloc] initWithFireDate:futureDate
interval:0.1
target:self
selector:@selector(testThread)
userInfo:nil
repeats:YES];
[myRunLoop addTimer:myTimer forMode:NSDefaultRunLoopMode];
}
}
上面的代码从不打印“ Test”。
但是,如果我将
[[NSRunLoop currentRunLoop] run];
放在-(void)testOnThread
方法的末尾,则每次都会触发计时器,它可以正常工作(Stackoverflow Question)。我的查询是,如果我们已经在提供定时器输入Source来运行循环,那么需要使用[[NSRunLoop currentRunLoop] run];
显式启动它 最佳答案
我会让其他人回答这个问题,为什么您必须自己run
runloop。但我想提出一个替代方案:
如果您想在后台线程上运行计时器,恕我直言,使用调度计时器最简单,根本不需要运行循环。只需定义计时器属性:
@property (nonatomic, strong) dispatch_source_t timer;
然后安排计时器在自定义队列上运行:
dispatch_queue_t queue = dispatch_queue_create("com.domain.app.timer", 0);
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(self.timer, dispatch_walltime(NULL, 0), 20ull * NSEC_PER_SEC, 1ull * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
// code to be performed periodically on background thread here
});
dispatch_resume(self.timer);
关于ios - 辅助NSThread的NSTimer不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27721566/