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" ); }); }); |