NSRunLoop API的区别

Ric*_*ard 4 nsrunloop ios

NSRunLoop有两个api:

- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate
Run Code Online (Sandbox Code Playgroud)

- (void)acceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ier 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
Run Code Online (Sandbox Code Playgroud)

另见NeXT:

方法limitDateForMode:返回模式NSDefaultRunLoopMode的所有输入源的最早限制日期.acceptInputForMode:beforeDate:运行循环直到该日期,处理它收到的任何输入,直到那个时间.为方便起见,您可以使用runMode:beforeDate:而不是.它使用您提供的模式调用acceptInputForMode:beforeDate:和limitDateForMode :.

简而言之:历史.