- (void)syncMain {
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"123"); });
}
在主队列中加入同步任务会造成死锁,这个在之前并没有很理解,只是知道会死锁,今天又碰到这个问题,感觉应该理解对了,举个例子说明一下。
- 比如有一天我不小心把身份证丢了,我就去派出所补办身份证,警察同志告诉我没有问题,可以补办,这时候我就有了一个任务,就是补办身份证(相当于主队列里的第一个任务:就是自信[self syncMain]方法)。
- 警察同志告诉我说补办身份证要证明我是我,这时候我就有了第二个任务(证明我是我),我就说你帮我补办出来身份证不就证明我是我了嘛,经常同志说你先证明你是你我才能帮你办身份证,然后……,相当于里面那个同步任务希望主队列帮他打印123(这时候主队列就有了第二个任务,打印123),主队列说不行我正在执行[self syncMain]方法,不能帮你打印123,同步任务说你帮我打印了123就是执行[self syncMain]方法,主队列说不行,我目前有任务在身,不能打印123,然后……,死锁就形成了
- 怎么解锁呢,这个时候如果有别的地方能证明我是我不就可以了,然后同步任务就说我到别的线程去执行123去,不找你了,然后一切OK
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[self syncMain];
});
网友评论