4

NSRunLoop 有两个 api:

- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate

- (void)acceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate

我的意思是除了返回值之外它们是相同的,还是有其他区别?

4

1 回答 1

5

正如@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:。

所以简短的回答:历史。

于 2013-08-13T14:34:04.317 回答