2013-03-21 58 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