Когда dispatch_source_t является таймером, почему поток продолжает меняться, если он не является основным потоком? - PullRequest
0 голосов
/ 04 августа 2020
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(self.timer, ^{
    NSLog(@"GCDTimer  %@", [NSThread currentThread]);
});
dispatch_resume(self.timer);

Результат печати:

2020-08-04 15: 01: 43.185442 + 0800 MemoryMore1 [7480: 1418672] GCDTimer {number = 6, name = (null)}

2020-08-04 15: 01: 44.679590 + 0800 MemoryMore1 [7480: 1418673] GCDTimer {number = 5, name = (null)}

2020-08-04 15: 01: 45.679329 + 0800 MemoryMore1 [7480: 1418673] GCDTimer {number = 5, name = (null)}

2020-08-04 15: 01: 46.678351 + 0800 MemoryMore1 [7480: 1418673] GCDTimer {number = 5, name = (null)}

2020-08-04 15: 01: 47.679343 + 0800 MemoryMore1 [7480: 1418673] GCDTimer {number = 5, name = (null)}

2020-08-04 15: 01: 48.678826 + 0800 MemoryMore1 [7480: 1418674] GCDTimer {number = 3, name = (null)}

Когда dispatch_source_t является таймером, почему поток продолжает меняться, если он не является основным потоком?

1 Ответ

0 голосов
/ 04 августа 2020

Очередь имеет несколько потоков и выберет один из них для использования при срабатывании таймера. Если очередь является параллельной (как и глобальная очередь), она выберет одну, даже если другая все еще работает. Если очередь является последовательной, она также будет выбирать из нескольких потоков, но одновременно будет выполняться только один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...