【发布时间】:2019-02-18 06:37:11
【问题描述】:
这只是一个实验代码,但我很困惑,因为代码没有按我的预期执行。
代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
self.myQueue = dispatch_queue_create("com.maxwell.timer", NULL);
dispatch_async(self.myQueue, ^{
self.timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"Hey!");
}];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
});
}
现在,我得到了一个输出“嘿!”每1秒,这里没问题。我确实知道在分派的线程中我必须明确地运行 runloop。
当我试图停止计时器时,问题就出现了。
- (void)stopTimer {
dispatch_async(self.myQueue, ^{
[self.timer invalidate];
self.Timer = nil;
});
}
实际上block中的代码甚至都不会执行!
而且,如果我在这里使用并发队列(dispatch_asyn(dispatch_get_global_queue(...), ^{...}))就可以了。
我知道的事情:每次我dispatch_async,无论是并发队列还是串行队列,代码都在不同的线程中执行。所以严格来说我没有在我添加它的同一线程中使计时器无效,但它确实在并发线程中无效。
所以我的问题是为什么它无法在串行队列中失效?
【问题讨论】:
标签: ios grand-central-dispatch nstimer