NSRunLoop 有两个 api:
- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate
和
- (void)acceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate
我的意思是除了返回值之外它们是相同的,还是有其他区别?
正如@DarkDust 暗示的那样,它曾经与计时器有关。请参阅Chris Kane 在 Cocoa 邮件列表上的讨论。在某一时刻,runMode:beforeDate:
是一个包装器limitDateForMode:
和acceptInputForMode:beforeDate:
(因为acceptInputForMode:beforeDate:
没有触发计时器)。我对文档、标题和崩溃堆栈的阅读表明,今天它们的行为相同(调用CFRunLoopRunInMode()
,它会触发计时器)。但我还没有建立一个测试应用程序来确认。
如果您阅读原始的NeXT ObjC 手册,acceptInputForMode:beforeDate:
用于明确不触发计时器:
等待来自输入模式模式的端口列表中端口的输入的块,直到limitDate 指定的时间。使用limitDateForMode: 方法计算limitDate。如果输入到达,则使用 NSPort 委托对其进行处理。此方法不检查与模式关联的计时器,因此即使其预定的触发日期已过,它也不会触发计时器。
计时器被明确处理为limitDateForMode:
轮询模式的输入源的限制日期(如果有)并返回此模式的最早限制日期。使用 NSPort 委托方法 limitDateForMode: 来确定端口的限制日期。如果它们的限制日期已过,则触发计时器。轮询端口以查找适合模式的活动。如果此模式没有输入源,则返回 nil。
这就是为了runMode:beforeDate:
方便而添加的原因(请参阅 参考资料NSRunloop.h
):
@interface NSRunLoop (NSRunLoopConveniences)
- (void)run;
- (void)runUntilDate:(NSDate *)limitDate;
- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate;
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
- (void)configureAsServer NS_DEPRECATED(10_0, 10_5, 2_0, 2_0);
#endif
另请参阅 NeXT:
方法limitDateForMode:返回模式NSDefaultRunLoopMode的所有输入源的最早限制日期。acceptInputForMode:beforeDate: 在该日期之前运行循环,处理它在该时间之前收到的任何输入。为方便起见,您可以改用 runMode:beforeDate:。它使用您提供的模式调用 acceptInputForMode:beforeDate: 和 limitDateForMode:。
所以简短的回答:历史。