我应该使用哪种方法定期调用方法?

时间:2013-03-05 06:02:25

标签: cocoa nstimer

我可以使用NSTimer或定期唤醒线程定期调用函数。这两种方法的行为基本相同:

        timer = [ NSTimer
                 scheduledTimerWithTimeInterval:1
                 target:self
                 selector:@selector(doSomething)
                 userInfo:nil
                 repeats:NO
                 ];

 @autoreleasepool {
        BOOL continueProcessingQueue = YES;
        while (continueProcessingQueue) {
            [self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:NO];
            NSDate *curtainTime = [[NSDate alloc] initWithTimeIntervalSinceNow:10];
            NSDate *currentTime = [[NSDate alloc] init];

            while (continueProcessingQueue && ([currentTime compare:curtainTime] != NSOrderedDescending)) {
                if ([self.processThread isCancelled] == YES) {
                    continueProcessingQueue = NO;
                }
                [NSThread sleepForTimeInterval:1];
                currentTime = [[NSDate alloc] init];
            }
        }
    }

使用计时器似乎更简单。是否存在第二种方法比使用计时器更可取的情况?

1 个答案:

答案 0 :(得分:0)

a)当您不跟踪辅助线程的活动状态时。一旦线程退出,您的计时器就会随之而来,这意味着您的计时器可能无法传递您期望的所有消息。

b)当您的工作线程实际上没有轮询运行循环(长任务)时,和/或当您的辅助线程的工作很少将控制返回到运行循环时,您需要更高的里程碑/进度准确性,您发布到其他线程。如果您的辅助线程在大多数时间闲置/等待,那么这不是一个大问题。

事实上,在大多数情况下,你真的不应该使用上述任何一种方法。