8

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

我试过了:

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

但是由于线程被重用,这只是意味着许多线程获得了这个名称,然后永远不会丢失它。我尝试将线程名称设置为 in-start并取消设置-finish,但线程名称从未出现在 Xcode 调试线程列表中。

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

4

4 回答 4

4

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

- (void)setName:(NSString *)newName

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

示例:( 线程 3 是我的)

在此处输入图像描述

来自苹果的文档

讨论

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

Xcode 是使用此信息在调试期间提供额外上下文的“工具”之一。

于 2013-03-21T23:16:05.037 回答
3

(此答案仅使用 Xcode 10.1 进行测试)

要回答帖子正文中的问题(不是标题),您需要设置 的OperationQueue底层队列的名称。通过这样做,该队列名称将在调试时显示在 Xcode 中(就像 main 或 global 一样DispatchQueues)。

例如:

var queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
queue.qualityOfService = .background
queue.underlyingQueue = DispatchQueue(
    label: "my-queue-dispatch-queue", qos: .background)

此示例将在 Xcode 10.1 中生成以下内容: 示例 Xcode 10.1 调试视图

参考underlyingQueue属性: https ://developer.apple.com/documentation/foundation/operationqueue/1415344-underlyingqueue

旁注:根据经验,“queue.qualityOfService = .SOMETHING”是必要的。见: https ://bugs.swift.org/browse/SR-9742

于 2019-01-24T07:31:45.963 回答
0

I also found that naming the NSOperationQueue will not name the thread in Xcode during debugging.

Solution: Add an operation that sets the thread's name, and add it to the queue once after creating the queue.

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

In your ViewController.m or whatever:

operationQueue = [[NSOperationQueue alloc] init];

#if defined(DEBUG)
    [self.operationQueue addOperation:[[NameThreadOperation alloc] init]];
#endif
于 2014-11-14T14:28:17.387 回答
0

通过这样做解决了问题:

[[NSThread currentThread] setName:@"ScreenSharingProcessorThread"];

代替:

[self setName: @"ScreenSharingProcessorThread"];

希望这可以帮助

于 2014-08-07T15:25:09.783 回答