iOS-常駐線程實現以及優雅退出方式

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());//結束內層循環
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章