GCD相当好用,但用不好就会死锁,始终要记着这样一句秘籍:
不要在串行队列放dispatch_sync、dispatch_apply
下面看几个例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
// 防死锁秘籍:不要在串行队列放dispatch_sync、dispatch_apply
// 死锁 主线程调用dispatch_apply
dispatch_async(dispatch_get_main_queue(), ^{
dispatch_apply(5, dispatch_get_main_queue(), ^(size_t i) {
NSLog
(@
"%ld"
,i);
NSLog
(@
"%d"
,55);
});
});
NSLog
(@
"%d"
,999);
//死锁 主线程调用dispatch_apply
dispatch_apply(5, dispatch_get_main_queue(), ^(size_t i) {
NSLog
(@
"%ld"
,i);
NSLog
(@
"%d"
,777);
});
//不死锁
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(5, queue, ^(size_t i) {
NSLog
(@
"%ld"
,i);
NSLog
(@
"%d"
,66);
});
NSLog
(@
"%d"
,88);
//不死锁
dispatch_async(queue, ^{
dispatch_apply(5, dispatch_get_main_queue(), ^(size_t i) {
NSLog
(@
"%ld"
,i);
});
});
// //不死锁
dispatch_async(queue,^{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog
(@
"test"
);
});
});
//死锁
dispatch_sync(queue,^{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog
(@
"test"
);
});
});
|