RunLoop的開啓方式:
- (void)run;
//使線程進入死循環,不利於控制線程退出,不推薦
- (void)runUntilDate:(NSDate *)limitDate;
//可以設置超時時間,在runloop處理完畢或者超時結束,可以選擇重新開啓runloop,優於上面的方式
- (BOOL)runMode:(NSRunLoopMode)mode beforeDate:(NSDate *)limitDate;
//除了時間設置外還可以設置runloop的運行模式,推薦
runloop的run調用方式:
public func run(){
//外層循環
while run(mode: .default, before:Date.distantFuture){ }
}
//默認運行runloop的kCFRunLoopDefaultMode
//內存循環
void CFRunLoopRun(void) { /* DOES CALLOUT */
int32_t result;
do {
//默認在kCFRunLoopDefaultMode下運行runloop
result = CFRunLoopRunSpecific(CFRunLoopGetCurrent(), kCFRunLoopDefaultMode, 1.0e10, false);
CHECK_FOR_FORK();
} while (kCFRunLoopRunStopped != result && kCFRunLoopRunFinished != result);
}
RunLoop的退出方式:
CFRunLoopStop(CFRunLoopGetCurrent());//結束內層循環
while (!_showStopRunLoopRun && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
//showStopRunLoopRun自己設置的變量,控制是否退出
部分代碼實現:
- (void)viewDidLoad {
[super viewDidLoad];
_thread = [[NSThread alloc] initWithTarget:self selector:@selector(runTest) object:nil];
_port = [[NSPort alloc] init];
_showStopRunLoopRun = false;
[_thread start];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self performSelector:@selector(test) onThread:_thread withObject:nil waitUntilDone:false];
}
-(void)test{
NSLog(@"-----Current Thread is %@", [NSThread currentThread]);
}
-(void)runTest{
[[NSRunLoop currentRunLoop] addPort:_port forMode: NSDefaultRunLoopMode];
//設置runLoop開啓兩秒調用退出方法退出runloop
[self performSelector:@selector(removeRunLoop) withObject:nil afterDelay:2];
//外層循環打破方式
while (!_showStopRunLoopRun && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
//當runloop退出時打印
NSLog(@"退出runLoop");
}
-(void)removeRunLoop{
_showStopRunLoopRun = true;
CFRunLoopStop(CFRunLoopGetCurrent());//結束內層循環
}