Xcode 显示的 URLSession 完成块未在委托队列上执行

URLSession completion block not executing on delegate queue shown by Xcode

我配置了一个 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];

下面是在 URLSession 启动之前我的名为 WEGQueue 的串行队列上进程的屏幕截图。

现在我希望在 URLSession 的指定委托队列上调用完成块操作,即此处的 WEGQueue。 但是,使用断点查看 Debug Navigator 显示该块正在任意队列上处理。下面附上图片。

下面是 "View Process by Queue" 过滤器中的调试导航器。

这真的很奇怪! 我不确定为什么 URLSession 没有在指定的委托队列上调用完成块。 这还不是全部。 它变得更奇怪,因为当我执行 po 时,lldb 说完成块(如预期的那样)在 WEGQueue 上。见下图。

令人困惑的是 Xcode's Debug Navigator 说 URLSession 的完成块正在任意线程上执行,而 lldb 说它在委托队列 WEGQueue.[=22= 上按预期执行]

有没有人遇到过类似的情况?这只是一个 Xcode GUI 错误吗?或者这里真的有什么不对劲?

我想说这只是一个 XCode GUI 限制,它并不总是用您给它的名称标记 "view by queue" 中的队列。而且它并不总是用线程当前正在处理的队列标记线程。正如您所说,当您执行 po [NSOperationQueue currentQueue] 时,它会报告正确的队列。所以你没有迹象表明它实际上使用了另一个队列。

不能保证同一个队列总是由同一个线程处理。每个事件都可以由不同的线程处理。对于串行队列,只能保证事件不是 运行 并行。