Блок завершения URLSession не выполняется в очереди делегатов, показанной Xcode - PullRequest
0 голосов
/ 14 января 2019

Я настроил URLSession для извлечения данных из сети и настроил очередь делегатов так, чтобы все последующие операции происходили в моей очереди. Однако при использовании точек останова для просмотра навигатора отладки Xcode показывает, что блок завершения URLSession вызывается в произвольных потоках.

URLSession настроен следующим образом -

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

self.urlSession = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:[MyManager sharedInstance].queue];

...

[self.urlSession dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

  /... operations expected to be executed on WEGQueue .../

}] resume];

Ниже приведен снимок экрана процессов в моей последовательной очереди с именем WEGQueue до запуска URLSession.

Pic 1

Теперь я ожидаю, что операции блока завершения будут вызваны в указанной очереди делегатов URLSession, т.е. здесь WEGQueue. Однако использование точки останова для просмотра отладочного навигатора показывает, что блок обрабатывается в произвольной очереди. Прикрепленное изображение ниже.

Pic 2

Ниже представлен отладочный навигатор в фильтре «Просмотр процесса по очереди».

enter image description here

Это действительно странно! Я не уверен, почему URLSession не вызывает блоки завершения в указанной очереди делегатов. И это еще не все. Это становится более странным из-за того, что когда я делаю po, lldb говорит, что блок завершения находится (как и ожидалось) в WEGQueue. Смотри картинку ниже.

Pic 3

Это сбивает с толку то, что Xcode's Debug Navigator говорит, что блок завершения URLSession выполняется в произвольном потоке, в то время как lldb говорит, что он выполняется должным образом в очереди делегатов WEGQueue.

Кто-нибудь сталкивался с подобным сценарием? Это просто ошибка Xcode GUI? Или здесь что-то не так?

1 Ответ

0 голосов
/ 15 января 2019

Я бы сказал, что это просто ограничение графического интерфейса XCode, так как оно не всегда помечает очередь в «просмотре по очереди» именем, которое вы ей дали. И он не всегда помечает потоки той очередью, которую в данный момент обрабатывает поток. Как вы говорите, когда вы делаете po [NSOperationQueue currentQueue], он сообщает о правильной очереди. Таким образом, у вас нет никаких признаков того, что он фактически использует другую очередь.

Нет гарантии, что одна и та же очередь всегда обрабатывается одним и тем же потоком. Каждое событие может быть обработано другим потоком. Существует только гарантия того, что события не будут выполняться параллельно для последовательной очереди.

...