将非主要的runloop任务转换为GCD

时间:2010-12-26 20:47:55

标签: iphone cocoa cocoa-touch grand-central-dispatch

我有一个定期运行的任务,它最初设计为在运行循环上运行,而不是使用NSThread和NSTimer的主runloop。

采用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之外我还能做些什么吗?

1 个答案:

答案 0 :(得分:2)

您可以使用DISPATCH_SOURCE_TYPE_TIMER将dispatch_source_create替换为使用NSTimer。那么你不需要运行循环。

回到最初的情况,你真的不需要创建一个线程或使用dispatch来运行一个计时器。运行循环的一点是你不需要让线程做一些简单的事情就像一个计时器。