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

时间:2019-01-14 14:03:28

标签: ios objective-c xcode nsurlsession nsoperationqueue

我已经配置了URLSession从网络中获取数据并设置了委托队列,以便所有后续操作都在我的队列中进行。 但是,当使用断点查看Debug导航器时,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的串行队列上的进程的屏幕截图。

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 :(得分:0)

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

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