#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong)NSThread *thread;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self createThread];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// waitUntilDone设置为YES,会阻塞主线程,优先在子线程中执行task2方法,task2方法执行完后主线程再继续后面的打印
// waitUntilDone设置为NO,子线程的task2方法和主线程的打印同时进行
[self performSelector:@selector(task2) onThread:self.thread withObject:nil
waitUntilDone:YES];
NSLog(@"cukiy1--%@",[NSThread currentThread]);
NSLog(@"cukiy2--%@",[NSThread currentThread]);
NSLog(@"cukiy3--%@",[NSThread currentThread]);
NSLog(@"cukiy4--%@",[NSThread currentThread]);
NSLog(@"cukiy5--%@",[NSThread currentThread]);
NSLog(@"----------");
}
- (void)createThread
{
// 创建子线程执行任务
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(task1) object:nil];
[thread start];
self.thread = thread;
}
- (void)task1
{
NSLog(@"task1--%@",[NSThread currentThread]);
// 子线程对应的runloop需要自己创建并开启
// 创建子线程对应的runloop,使子线程一直存在
NSRunLoop *currentRunloop = [NSRunLoop currentRunLoop];
// 给runloop添加一个基于port的事件(系统事件),让runloop的运行模式不为空,保证runloop不退出
[currentRunloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
// 开启运行循环
[currentRunloop run];
}
- (void)task2
{
// sleep(3);
NSLog(@"task2-1-%@",[NSThread currentThread]);
NSLog(@"task2-2-%@",[NSThread currentThread]);
NSLog(@"task2-3-%@",[NSThread currentThread]);
NSLog(@"task2-4-%@",[NSThread currentThread]);
}
@end
如何创建常驻线程以及waitUntilDone参数的作用
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...