RunLoop常駐執行緒

weixin_33860722發表於2016-12-05
1599230-e5f60da7517cc5fd.jpeg
62cdfbda95d3cb31b132ba83adb028848926625cbf28-FIdW4E_fw658.jpeg

在開發中,經常遇到的便是開啟一個執行緒,當執行緒的任務完成,該執行緒便會被自動收回。
但是如果我們需要一個執行緒一直存在,等待執行某個任務該怎麼辦呢?
我們可以使用RunLoop來實現
首先:
1. 執行緒的宣告週期與任務有關,任務完成之後,他就會被系統自動銷燬,以節省開支。
2.RunLoop用於控制NSRunLoop裡面執行緒的執行和休眠,在有事情做的時候使當前NSRunLoop控制的執行緒工作,沒有事情做讓當前NSRunLoop的控制的執行緒休眠。
3.每個RunLoop都有一個mode ,model中有timer/source/observer/, 只要這個mode存在,RunLoop 就不會退出

程式碼實現

@interface ViewController ()
@property (strong, nonatomic)   NSThread            *subThread;  
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
//建立一個子執行緒
    NSThread *subThread = [[NSThread alloc] initWithTarget:self selector:@selector(subThread) object:nil];
//開啟執行緒
    [subThread start];
    self.subThread = subThread;

 }
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//當點選的時候在指定的執行緒上執行一個任務
    [self performSelector:@selector(threadAction) onThread:self.subThread withObject:nil waitUntilDone:NO];
}
//繫結執行緒事件
- (void) subThread
{
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
    [runLoop run];//加入當前的RunLoop
}
- (void)threadAction
{
      [NSThread sleepForTimeInterval:3.0];
}
@end

相關文章