Objective c 命名NSOperationQueue中的线程

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调试线程列表中 命名线

正如您所期望的那样,NSOperationQueue创建了许多线程。但当您暂停应用程序并在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)