NSRunLoop有两个apis:
- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate
和
- (void)acceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate
我的意思是它们除了返回值之外是相同的,还是有其他差异?
答案 0 :(得分:5)
正如@DarkDust暗示的那样,它曾经与定时器有关。见Chris Kane's discussions on the Cocoa mailing list。有一次,runMode:beforeDate:
是limitDateForMode:
和acceptInputForMode:beforeDate:
的封套(因为acceptInputForMode:beforeDate:
没有触发定时器)。我对文档,标题和崩溃堆栈的阅读表明,今天它们的行为相同(调用CFRunLoopRunInMode()
,它会触发定时器)。但我还没有建立一个测试应用程序来确认。
如果您阅读原始NeXT ObjC manual,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:。
简短的回答:历史。