Я настроил 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.
Теперь я ожидаю, что операции блока завершения будут вызваны в указанной очереди делегатов URLSession, т.е. здесь WEGQueue.
Однако использование точки останова для просмотра отладочного навигатора показывает, что блок обрабатывается в произвольной очереди. Прикрепленное изображение ниже.
Ниже представлен отладочный навигатор в фильтре «Просмотр процесса по очереди».
Это действительно странно!
Я не уверен, почему URLSession не вызывает блоки завершения в указанной очереди делегатов.
И это еще не все.
Это становится более странным из-за того, что когда я делаю po
, lldb
говорит, что блок завершения находится (как и ожидалось) в WEGQueue. Смотри картинку ниже.
Это сбивает с толку то, что Xcode's Debug Navigator
говорит, что блок завершения URLSession выполняется в произвольном потоке, в то время как lldb
говорит, что он выполняется должным образом в очереди делегатов WEGQueue
.
Кто-нибудь сталкивался с подобным сценарием? Это просто ошибка Xcode GUI? Или здесь что-то не так?