1

我可以使用 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];
            }
        }
    }

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

4

1 回答 1

0

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

b)当您的工作线程实际上没有轮询运行循环(长任务)时,和/或当您的辅助线程的工作很少将控制权返回给运行循环并且您需要更高的里程碑/进度的准确性时发布到其他线程。如果您的辅助线程大部分时间都处于空闲/等待状态,那么这不是什么大问题。

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

于 2013-03-05T06:29:08.993 回答