- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
NSLog(@"1");
//这句话的本质是往runloop中添加定时器
[self performSelector:@selector(test) withObject:nil afterDelay:.0];
NSLog(@"3");
//若不启动runloop 子线程中是不会执行定时器的 打印结果为 1 3 执行了 打印结果为 1 3 2
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
});
}
-(void)test{
NSLog(@"2");
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSThread *thred = [[NSThread alloc]initWithBlock:^{
NSLog(@"1");
//启动runloop 这时候runloop是处于休眠状态 等待后面给它发消息 ;如不执行 打印为1 并且崩溃
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}];
[thred start];
[self performSelector:@selector(test) onThread:thred withObject:nil waitUntilDone:YES];
}
-(void)test{
NSLog(@"2");
}
线程组
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
for (int i =0; i<5; i++) {
NSLog(@"1-%@",[NSThread currentThread]);
}
});
dispatch_group_async(group, queue, ^{
for (int i =0; i<5; i++) {
NSLog(@"2-%@",[NSThread currentThread]);
}
});
// dispatch_group_notify(group, queue, ^{
// dispatch_async(dispatch_get_main_queue(), ^{
// for (int i =0; i<5; i++) {
// NSLog(@"3-%@",[NSThread currentThread]);
// }
// });
// }); 等价月=于下面
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
for (int i =0; i<5; i++) {
NSLog(@"3-%@",[NSThread currentThread]);
}
});
}
来源:https://www.cnblogs.com/ZhangShengjie/p/12269185.html