NSRunLoop API的区别

时间:2013-08-13 13:47:52

标签: ios nsrunloop

NSRunLoop有两个apis:

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

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

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

1 个答案:

答案 0 :(得分:5)

正如@DarkDust暗示的那样,它曾经与定时器有关。见Chris Kane's discussions on the Cocoa mailing list。有一次,runMode:beforeDate:limitDateForMode:acceptInputForMode:beforeDate:的封套(因为acceptInputForMode:beforeDate:没有触发定时器)。我对文档,标题和崩溃堆栈的阅读表明,今天它们的行为相同(调用CFRunLoopRunInMode(),它会触发定时器)。但我还没有建立一个测试应用程序来确认。

如果您阅读原始NeXT ObjC manualacceptInputForMode: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:。

简短的回答:历史。