runloop启动前必须先添加输入源或定时器源,否则runloop一启动就会退出。总之runloop需要有监听的事件,否则就会退出。
启动runloop
NSRunLoop提供了如下3种启动runloop的方法。当然NSRunLoop其实封装的是CFRunloop。
1 | - (void)run NS_SWIFT_UNAVAILABLE_FROM_ASYNC("run cannot be used from async contexts."); |
相同点:如果没有输入源或定时器源附加到runloop上,runloop会马上退出,并且方法也会立即退出。
run
它会让runloop置身在一个永久的循环当中.即使runloop因为处理完了某个输入源事件而退出,该方法又会让它重新运行.因此如果你想处理完某个事件后能够退出runloop,那么你就不能使用该方法了。runloop运行在default模式。
runUntilDate:
和run方法差不多只是多了个截止时间,截止时间到了runloop就会退出。runloop同样运行在default模式。
runMode:beforeDate:
可以指定runloop运行的模式以及一个截止时间。处理定时器源事件后不会退出runloop,但处理输入源事件后会退出runloop,因此需要外部重新驱动进入runloop。
退出runloop
根据官方文档,手动移除输入源或定时器源不能确保runloop会退出。最好的办法是使用runMode:beforeDate:方法启动runloop,设立标志位,给子线程发送消息perform selector。