2011-11-15 2 views
0

새 스레드에서 데몬을 시작하고 싶습니다. 데몬에서 입력을 기다리는 동안 프로그램이 잠기지 않지만 데몬에서 정보를 얻으려면 주 프로그램에 대한 방법이 필요합니다. 새로운 스레드를 실행하기 위해 NSThread를 사용했지만 NSThread와 함께 대리자를 사용하는 방법을 알지 못합니다.비동기 적으로 NSThread를 실행하지만 대리자를 사용합니까?

더 많은 컨텍스트에서 네트워크에서 데이터를받을 Quartz Composer 용 사용자 지정 패치를 작성하고 있습니다. 아이디어는 두 번째 스레드가 데몬을 실행할 수 있고, 각 프레임에서 데몬 스레드가 새로운 데이터를 받았을 때 대리자 메서드에 의해 설정된 ivar에서 새로운 데이터를 가져옵니다. 컴포지션은 다음과 같이 실행됩니다. 중단 없음.

NSThread로이 작업을 수행 할 수 있습니까? 내가보고 있어야하는 더 좋은 방법이 있습니까?

답변

1

편집 : 당신이 가서 여기

[NO 대표 performSelectorOnMainThread : @selector (threadDidSomething : withObject : 자기 waitUntilDone] 당신이 대리인 콜백 주 스레드에서 발생하려면이 패턴을 사용 . 나는 이것이 자명하다라고 생각한다. 그렇지 않다면, 단지 나에게 알려주세요. 참고 : 방금 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

당신은 대신 NSThread의 작업 큐 (NSOperation) 또는 파견 큐 (GCD)를 사용하여 고려할 수 있습니다.

아직 읽어 본 적이 없다면 Apple의 Concurrency Programming Guide을 살펴보십시오. 명시 적 스레드 생성 대신 큐 기반 접근 방식을 권장합니다.