2013-03-21 62 views
3

NSOperationQueue按照您的期望和愿望创建了许多线程。但是,当您暂停应用程序并在XCode中进行调试时,不清楚哪些线程属于一个操作队列,哪些线程属于另一个操作队列。在NSOperationQueue中命名线索

我试过[NSThread currentThread] setName:@“My amazing operation thread”],但随着线程被重用,这只是意味着许多线程得到这个名称,然后永远不会失去它。我已经尝试在-start中设置线程名称并将其设置为-finish,但线程名称从不显示在XCode调试线程列表中。

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

+0

命名线程是没有意义的与队列工作时。技术上,队列可以使用任何线程,并且哪个线程是实现细节。多个队列可能共享线程,细节仍留给不透明的实现。 – bbum 2013-03-22 02:32:24

回答

4

来命名NSOperationQueue,你可以使用:

- (void)setName:(NSString *)newName 

调试时,线程的名字出现在线程下的联合国浅灰色。

实施例:(线3矿)

enter image description here

Apple's documentation

讨论

名称提供一个让您在运行时识别您的操作队列。工具也可以在调试或分析代码时使用该名称来提供额外的 上下文。

Xcode是使用此信息在调试过程中提供附加上下文的“工具”之一。

+0

我试过这个,发现它并非如此。 [_operationQueue setName:@“my awesome operation queue”]; 调试线程列表中没有显示任何内容。 – 2013-03-21 23:52:42

+0

@NickLocking嗯,我不明白。我一直都在使用它......调试时,线程的名称在线程下显示为浅灰色,位于Xcode的左侧窗格中。看我的例子。 – Jean 2013-03-21 23:53:41

+0

您可以在拼写错误的'dispatch'和名称处的'jssensors'处识别自定义命名的线程。你使用的是什么版本的Xcode?我在'版本4.6.1(4H512)'。 – Jean 2013-03-22 00:00:14

0

通过这样做来解决问题[[NSThread currentThread] setName:@"ScreenSharingProcessorThread"];而不是[self setName: @"ScreenSharingProcessorThread"];。希望将有所帮助

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