我已经配置了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
的串行队列上的进程的屏幕截图。
现在,我希望对URLSession的指定委托队列(即此处的WEGQueue)调用完成块操作。 但是,使用断点查看“调试导航器”显示正在任意队列上处理该块。所附图片如下。
下面是“按队列查看进程”过滤器中的调试导航器。
这真的很奇怪!
我不确定为什么URLSession不调用指定委托队列上的完成块。
不仅如此。
由于当我执行po
时,lldb
说完成块位于(如预期的那样)在WEGQueue上,因此它变得很奇怪。参见下面的图片。
令人困惑的是,Xcode's Debug Navigator
说URLSession的完成块是在任意线程上执行的,而lldb
说它是按预期在委托队列WEGQueue
上执行的。
有人遇到过类似的情况吗?这只是Xcode GUI错误吗?还是这里真的有什么不对?
答案 0 :(得分:0)
我会说这只是XCode GUI的限制,它并不总是使用您给它命名的名称在“按队列查看”中标记队列。而且,它并不总是使用线程当前正在处理的队列来标记线程。如您所说,当您执行po [NSOperationQueue currentQueue]
时,它会报告正确的队列。因此,您没有迹象表明它实际上使用了另一个队列。
不能保证同一队列总是由同一线程处理。每个事件可以由不同的线程处理。对于串行队列,只能保证事件不会并行运行。