一、GCD
串行队列产生的死锁:
只要使用sync函数往同一个串行队列中添加任务,就会产生死锁。只要改为async函数或改为并发队列就不会产生死锁。
- sync:要求立刻执行队列里的任务。
- 串行队列:队列里的任务取出一个执行完毕,再去下一个任务执行。
- 并发队列:从队列里取出一个任务后不必等执行完毕,就可以去取下一个任务执行。
面试题:
-
比较一下情况
源码分析:
-
代码1:
- performSelector: withObject: afterDelay:方法的本质是在RunLoop中添加定时器
- 先打印1,3再打印2原因:处理完touchBegan事件后再处理定时器事件。
-
代码2:
- performSelector: withObject: 的本质是objcMsgSend
-
代码3:
- 不打印2,是因为在子线程中默认没有创建RunLoop。
二、GNUstep
面试题
二、GCD队列组
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 创建队列组
dispatch_group_t group = dispatch_group_create();
// 创建并发队列
dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_CONCURRENT);
// 添加异步任务
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]);
// }
// });
//如果是并发队列,就在子线程中并发执行
dispatch_group_notify(group, queue, ^{
for (int i = 0; i < 5; i++) {
NSLog(@"任务3-%@", [NSThread currentThread]);
}
});
dispatch_group_notify(group, queue, ^{
for (int i = 0; i < 5; i++) {
NSLog(@"任务4-%@", [NSThread currentThread]);
}
});
}
@end