2010-12-26 2 views
3

주기적으로 실행되는 태스크가 있는데 원래 NSThread 및 NSTimer를 사용하여 메인 runloop과는 별도의 실행 루프에서 실행되도록 설계되었습니다.비 메인 runloop 작업을 GCD로 변환

GCD를 활용하기 위해이 기술을 적용하는 가장 좋은 방법은 무엇입니까?

현재 코드 :

-(void)initiateSomeTask 
{ 
    [NSThread detachNewThreadSelector:@selector(startTimerTask) 
      toTarget:self withObject:nil]; 
} 

-(void)startTimerTask 
{ 
    // We won't get back the main runloop since we're on a new thread 
    NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop]; 

    NSPort *myPort = [NSMachPort port]; 
    [myRunLoop addPort:myPort forMode:NSDefaultRunLoopMode]; 

    NSTimer *myTimer = [NSTimer timerWithTimeInterval:10 /* seconds */ 
      target:self selector:@selector(doMyTaskMethod) 
      userInfo:nil repeats:YES]; 

    [myRunLoop addTimer:myTimer forMode:NSRunLoopCommonModes]; 
    [myRunLoop run]; 
} 

내가 외에 할 dispatch_asyncdetachNewThreadSelector를 대체 할 수 있나요?

답변

2

DISPATCH_SOURCE_TYPE_TIMER를 사용하여 dispatch_source_create를 사용하여 NSTimer 사용을 바꿀 수 있습니다. 그러면 실행 루프가 필요하지 않습니다.

원래의 경우로 돌아가서 실제로 타이머를 실행하려면 스레드를 만들거나 디스패치를 ​​할 필요가 없습니다. 실행 루프의 종류는 타이머와 같은 간단한 작업을 스레드에서 수행 할 필요가 없다는 것입니다.

관련 문제