gpt4 book ai didi

ios - 辅助 NSThread 中的 NSTimer 不起作用

转载 作者:行者123 更新时间:2023-11-29 02:24:27 24 4
gpt4 key购买 nike

根据 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) .我的问题是,如果我们已经为运行循环提供定时器输入源,那么需要使用 [[NSRunLoop currentRunLoop] 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com