NSOperationQueue会创建许多线程,正如您所期望的那样。但是当您暂停应用程序并在Xcode中调试它时,不清楚哪些线程属于一个操作队列,哪些线程属于另一个操作队列。
我试过了:
[NSThread currentThread] setName: @"My amazing operation thread"]
但是当线程被重用时,这只意味着许多线程获得此名称,然后永远不会丢失它。我已尝试在-start
中设置线程名称并在-finish
中取消设置,但线程名称永远不会出现在Xcode调试线程列表中。
命名线程/操作以使它们在Xcode中更容易调试的好方法是什么?
答案 0 :(得分:4)
要命名您的NSOperationQueue,您可以使用:
- (void)setName:(NSString *)newName
调试时,线程名称在线程下显示为浅灰色。
示例: (主题3是我的)
讨论
名称提供了一种在运行时标识操作队列的方法。工具也可以使用此名称来提供额外的名称 调试或分析代码时的上下文。
Xcode是使用此信息在调试期间提供其他上下文的“工具”之一。
答案 1 :(得分:1)
(此答案仅在Xcode 10.1上进行了测试)
要在帖子正文(而不是标题)中回答问题,您需要设置OperationQueue
的基础队列的名称。这样,该队列名称将在调试时以Xcode显示(就像主DispatchQueues
或全局var queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.qualityOfService = .background
queue.underlyingQueue = DispatchQueue(
label: "my-queue-dispatch-queue", qos: .background)
一样)。
例如:
underlyingQueue
对Dockerfile
属性的引用:https://developer.apple.com/documentation/foundation/operationqueue/1415344-underlyingqueue
旁注:根据经验,“ queue.qualityOfService = .SOMETHING”是必要的。参见:https://bugs.swift.org/browse/SR-9742
答案 2 :(得分:0)
通过这样做解决了问题:
[[NSThread currentThread] setName:@"ScreenSharingProcessorThread"];
而不是:
[self setName: @"ScreenSharingProcessorThread"];
希望这有帮助
答案 3 :(得分:0)
我还发现命名NSOperationQueue不会在调试期间命名Xcode中的线程。
解决方案:添加设置线程名称的操作,并在创建队列后将其添加到队列中。
NameThreadOperation.h
#import <Foundation/Foundation.h>
@interface NameThreadOperation : NSOperation
@end
NameThreadOperation.m
#import "NameThreadOperation.h"
@implementation NameThreadOperation
- (void)main
{
@autoreleasepool
{
[[NSThread currentThread] setName:@"Name of the thread"];
}
}
@end
在ViewController.m或其他任何内容中:
operationQueue = [[NSOperationQueue alloc] init];
#if defined(DEBUG)
[self.operationQueue addOperation:[[NameThreadOperation alloc] init]];
#endif