
62cdfbda95d3cb31b132ba83adb028848926625cbf28-FIdW4E_fw658.jpeg
在開發(fā)中,經常遇到的便是開啟一個線程,當線程的任務完成,該線程便會被自動收回。
但是如果我們需要一個線程一直存在,等待執(zhí)行某個任務該怎么辦呢?
我們可以使用RunLoop來實現
首先:
1. 線程的聲明周期與任務有關,任務完成之后,他就會被系統自動銷毀,以節(jié)省開支。
2.RunLoop用于控制NSRunLoop里面線程的執(zhí)行和休眠,在有事情做的時候使當前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];
//創(chuàng)建一個子線程
NSThread *subThread = [[NSThread alloc] initWithTarget:self selector:@selector(subThread) object:nil];
//開啟線程
[subThread start];
self.subThread = subThread;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//當點擊的時候在指定的線程上執(zhí)行一個任務
[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