Objective c 命名NSOperationQueue中的线程
正如您所期望的那样,NSOperationQueue创建了许多线程。但当您暂停应用程序并在Xcode中调试它时,不清楚哪些线程属于一个操作队列,哪些属于另一个 我试过:Objective c 命名NSOperationQueue中的线程,objective-c,nsthread,nsoperation,nsoperationqueue,Objective C,Nsthread,Nsoperation,Nsoperationqueue,正如您所期望的那样,NSOperationQueue创建了许多线程。但当您暂停应用程序并在Xcode中调试它时,不清楚哪些线程属于一个操作队列,哪些属于另一个 我试过: [NSThread currentThread] setName: @"My amazing operation thread"] 但是当线程被重用时,这就意味着许多线程都会得到这个名称,并且永远不会丢失它。我已尝试在-start中设置线程名称,并在-finish中取消设置,但线程名称从未显示在Xcode调试线程列表中 命名线
[NSThread currentThread] setName: @"My amazing operation thread"]
但是当线程被重用时,这就意味着许多线程都会得到这个名称,并且永远不会丢失它。我已尝试在-start
中设置线程名称,并在-finish
中取消设置,但线程名称从未显示在Xcode调试线程列表中
命名线程/操作以使其更易于在Xcode中调试的好方法是什么 要命名NSOperationQueue,可以使用:
- (void)setName:(NSString *)newName
调试时,线程的名称在线程下显示为非浅灰色
示例:(线程3是我的)
发件人:
讨论
名称为您提供了一种在运行时识别操作队列的方法。工具也可以使用此名称来提供其他信息
调试或分析代码期间的上下文
Xcode是在调试期间使用此信息提供附加上下文的“工具”之一。通过执行以下操作修复了此问题:
[[NSThread currentThread] setName:@"ScreenSharingProcessorThread"];
而不是:
[self setName: @"ScreenSharingProcessorThread"];
希望这有帮助我还发现,在调试期间,命名NSOperationQueue不会在Xcode中命名线程 解决方案:添加一个设置线程名称的操作,并在创建队列后将其添加到队列中一次 NameThreadOperation.h 在ViewController.m或其他文件中:
operationQueue = [[NSOperationQueue alloc] init];
#if defined(DEBUG)
[self.operationQueue addOperation:[[NameThreadOperation alloc] init]];
#endif
(此答案仅使用Xcode 10.1测试)
要回答文章正文中的问题(而不是标题),您需要设置操作队列
的基础队列的名称。这样,在调试时,该队列名称将显示在Xcode中(就像主队列或全局队列一样)
例如:
var queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.qualityOfService = .background
queue.underlyingQueue = DispatchQueue(
label: "my-queue-dispatch-queue", qos: .background)
此示例将在Xcode 10.1中产生以下内容:
对underyingqueue
属性的引用:
旁注:根据经验,“queue.qualityOfService=.SOMETHING”是必需的。请参阅:我尝试过这一点,但发现情况并非如此。[\u operationQueue setName:@“我最棒的操作队列”];调试线程列表中没有显示任何内容。@NickLocking,我不明白。我一直在使用它…调试时,线程的名称在Xcode的左窗格中的线程下以浅灰色显示。参见我的示例。您可以在拼写错误的
dispatch
和名称中的jssensors
处识别自定义命名线程。您使用的是什么版本的Xcode?我使用的是版本4.6.1(4H512)
。最新版本。我唯一能想到的就是我在使用并发操作。@NickLocking这可能就是原因。我正在连续使用它。当您选择“按队列查看进程”而不是“按线程”(调试时,位于左面板右上角)时,Xcode告诉您什么?在处理队列时,命名线程是没有意义的。从技术上讲,队列可以使用任何线程,并且哪个线程是实现细节。多个队列可能共享线程,同样,细节留给不透明的实现。
operationQueue = [[NSOperationQueue alloc] init];
#if defined(DEBUG)
[self.operationQueue addOperation:[[NameThreadOperation alloc] init]];
#endif
var queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.qualityOfService = .background
queue.underlyingQueue = DispatchQueue(
label: "my-queue-dispatch-queue", qos: .background)