在NSOperationQueue中命名线程

时间:2013-03-21 23:14:41

标签: objective-c nsthread nsoperation nsoperationqueue

NSOperationQueue会创建许多线程,正如您所期望的那样。但是当您暂停应用程序并在Xcode中调试它时,不清楚哪些线程属于一个操作队列,哪些线程属于另一个操作队列。

我试过了:

[NSThread currentThread] setName: @"My amazing operation thread"]

但是当线程被重用时,这只意味着许多线程获得此名称,然后永远不会丢失它。我已尝试在-start中设置线程名称并在-finish中取消设置,但线程名称永远不会出现在Xcode调试线程列表中。

命名线程/操作以使它们在Xcode中更容易调试的好方法是什么?

4 个答案:

答案 0 :(得分:4)

要命名您的NSOperationQueue,您可以使用:

- (void)setName:(NSString *)newName

调试时,线程名称在线程下显示为浅灰色。

示例: (主题3是我的)

enter image description here

来自Apple's documentation

  

讨论

     

名称提供了一种在运行时标识操作队列的方法。工具也可以使用此名称来提供额外的名称   调试或分析代码时的上下文。

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

此示例将在Xcode 10.1中产生以下内容: Example Xcode 10.1 Debug View

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