@interface ViewController ()
@property (nonatomic,strong) NSThread *thread;
@end
@implementation ViewController
-(void)viewDidLoad{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
//获取这个常驻内存的线程
self.thread= [ViewController longTermThread];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{
//在该线程上提交任务
[self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];
}
-(void)test{
NSLog(@"test");
NSLog(@"%@",[NSThread currentThread]);
}
+ (void)entryPoint
{
//设置当前线程名为MyThread
[[NSThread currentThread] setName:@"MyThread"];
//获取NSRunLoop对象,第一次获取不存在时系统会创建一个
NSRunLoop*runloop = [NSRunLoopcurrentRunLoop];
/*
添加一个Source1事件的监听端口
RunLoop对象会一直监听这个端口,由于这个端口不会有任何事件到来所以不会产生影响
监听模式是默认模式,可以修改为Common
*/
[runloopaddPort:[NSPort port] forMode:NSDefaultRunLoopMode];
//启动RunLoop
[runlooprun];
}
+ (NSThread*)longTermThread
{
//静态变量保存常驻内存的线程对象
staticNSThread*longTermThread =nil;
//使用GCD dispatch_once 在应用生命周期只执行一次常驻线程的创建工作
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
//创建一个线程对象,并执行entryPoint方法
longTermThread = [[NSThreadalloc]initWithTarget:selfselector:@selector(entryPoint)object:nil];
//启动线程,启动后就会执行entryPoint方法
[longTermThreadstart];
});
returnlongTermThread;
}
@end
网友评论