我可以使用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];
}
}
}
使用计时器似乎更简单。是否存在第二种方法比使用计时器更可取的情况?
答案 0 :(得分:0)
a)当您不跟踪辅助线程的活动状态时。一旦线程退出,您的计时器就会随之而来,这意味着您的计时器可能无法传递您期望的所有消息。
b)当您的工作线程实际上没有轮询运行循环(长任务)时,和/或当您的辅助线程的工作很少将控制返回到运行循环时,您需要更高的里程碑/进度准确性,您发布到其他线程。如果您的辅助线程在大多数时间闲置/等待,那么这不是一个大问题。
事实上,在大多数情况下,你真的不应该使用上述任何一种方法。