2011-11-15 78 views
0

我想在新線程上啓動一個守護進程,以使我的程序在等待守護進程的輸入時不會鎖定,但我需要一種讓主程序從守護進程獲取信息的方法。我用NSThread來啓動一個新的線程,但我沒有看到如何使用NSThread的代理。異步運行NSThread,但使用委託?

關於更多的上下文,我正在爲Quartz Composer開發一個自定義的補丁,它將接收來自網絡的數據。這個想法是第二個線程可以運行守護進程,並且在每個幀上,當守護進程線程接收到新數據時,我會從委託方法設置的一個ivar中獲取新數據。組合一直運行不中斷。

我可以用NSThread來做這個嗎?有更好的方法我應該看?

回答

1

編輯:如果您想委託回調主線程上發生的,使用這個模式: [委託performSelectorOnMainThread:@selector(threadDidSomething :) withObject:自waitUntilDone:NO]

在這裏你去。我相信這是不言而喻的,但如果沒有,請讓我知道。請注意:我剛剛編寫了基於API的代碼,但尚未對其進行測試,因此請小心。

@protocol ThreadLogicContainerDelegate <NSObject> 
- (void)threadLogicContainerDidStart:(ThreadLogicContainer*)theThreadLogicContainer; 
- (void)threadLogicContainerDidFinish:(ThreadLogicContainer*)theThreadLogicContainer; 
@end 

@interface ThreadLogicContainer 

- (void)doWorkWithDelegate:(id<ThreadLogicContainerDelegate>)delegate; 

@end 

@implementation ThreadLogicContainer 

- (void)doWorkWithDelegate:(id<ThreadLogicContainerDelegate>)delegate 
{ 
    @autoreleasepool 
    { 
     [delegate threadLogicContainerDidStart:self]; 

     // do work 

     [delegate threadLogicContainerDidFinish:self]; 
    } 
} 

@end 


@interface MyDelegate <ThreadLogicContainerDelegate> 
@end 

@implementation MyDelegate 
- (void)threadLogicContainerDidStart:(ThreadLogicContainer*)theThreadLogicContainer 
{} 
- (void)threadLogicContainerDidFinish:(ThreadLogicContainer*)theThreadLogicContainer 
{} 
@end 

使用範例:

ThreadLogicContainer* threadLogicContainer = [ThreadLogicContainer new]; 
[NSThread detachNewThreadSelector:@selector(doWorkWithDelegate:) 
         toTarget:threadLogicContainer 
         withObject:myDelegate]; 

參考:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html

+0

非常有幫助的回覆! – Adam

2

您可能還需要考慮使用操作隊列(的NSOperation)或調度隊列(GCD),而不是NSThread。

如果你還沒有,請看看蘋果的Concurrency Programming Guide;他們真的推薦使用基於隊列的方法而不是顯式創建線程。