停止RunLoop

启动一个runloop有以下三种方法

- (void)run;  
- (void)runUntilDate:(NSDate *)limitDate;
- (void)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate;
  1. 第一种方式,runloop会一直运行下去,在此期间会处理来自输入源的数据,并且会在NSDefaultRunLoopMode模式下重复调用runMode:beforeDate:方法;
  2. 第二种方式,可以设置超时时间,在超时时间到达之前,runloop会一直运行,在此期间runloop会处理来自输入源的数据,并且也会在NSDefaultRunLoopMode模式下重复调用runMode:beforeDate:方法;
  3. 第三种方式,runloop会运行一次,超时时间到达或者第一个input source被处理,则runloop就会退出。

前两种启动方式会重复调用runMode:beforeDate:方法。

第一种方式的runLoop启动后 不能退出

第二种方式 通过设置超时时间推出RunLoop

第三种方式 runloop会运行一次,当超时时间到达或者第一个输入源被处理,runloop就会退出。

自己控制退出时机

NSRunLoop *myLoop  = [NSRunLoop currentRunLoop];
 myPort = (NSMachPort *)[NSMachPort port];
 [myLoop addPort:_port forMode:NSDefaultRunLoopMode];

BOOL isLoopRunning = YES; // global

while (isLoopRunning && [myLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

//关闭runloop的地方
- (void)quitLoop
 {
    isLoopRunning = NO;
    CFRunLoopStop(CFRunLoopGetCurrent());
}

参考文档:
NSRunLoop退出方式