根据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/

10-14 20:32