Это просто экспериментальный код, но я запутался, так как код не выполнялся, как я предполагал.
Код похож на:
- (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];
});
}
Теперь я получил вывод "Эй!" каждую секунду здесь нет проблем Я знаю, что в отправляемом потоке я должен явно запустить runloop.
Проблема возникла, когда я попытался остановить таймер.
- (void)stopTimer {
dispatch_async(self.myQueue, ^{
[self.timer invalidate];
self.Timer = nil;
});
}
На самом деле код в блоке даже не будет выполнен!
Более того, если бы я использовал параллельную очередь здесь (dispatch_asyn(dispatch_get_global_queue(...), ^{...})
), все было бы в порядке.
Вещи, которые я знаю: каждый раз, когда я dispatch_async
, независимо от параллельной или последовательной очереди, код выполняется в другом потоке. Строго говоря, Я не сделал недействительным таймер в том же потоке, где я его добавил , но он сделал недействительным в параллельном потоке.
Итак, мой вопрос: почему он не был признан недействительным в последовательной очереди?