2010-12-26 3 views
3

私は定期的に実行されるタスクを持っていますが、もともとNSThreadとNSTimerを使用しているメイン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の使用を置き換えることができます。実行ループは必要ありません。

元のケースでは、スレッドを作成したり、ディスパッチを使用してタイマーを実行したりする必要はありません。実行ループの種類の種類は、タイマーのような簡単なことをするスレッドを作る必要はないということです。

関連する問題