3

定期的に実行されるタスクがあり、元々はNSThreadとNSTimerを使用してメインの実行ループとは別の実行ループで実行するように設計されていました。

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];
}

置き換える以外にできることはありdetachNewThreadSelectorますdispatch_asyncか?

4

1 に答える 1

2

NSTimerの使用をdispatch_source_createの使用とDISPATCH_SOURCE_TYPE_TIMERに置き換えることができます。その場合、実行ループは必要ありません。

ただし、元のケースに戻ると、タイマーを実行するためにスレッドを作成したり、ディスパッチを使用したりする必要はありません。実行ループのポイントの一種は、タイマーのような単純なことを行うためにスレッドを作成する必要がないということです。

于 2010-12-26T22:22:24.673 に答える