6个结果搞懂 GCD中 QUEUE 和 async/sync
来源:互联网 发布:网络播放器哪个最好 编辑:程序博客网 时间:2024/06/06 01:49
同一个blockObject
01
SSViewController *firstVC = (SSViewController *)self.window.rootViewController;
02
[firstVC gcdTestMethod:^{
03
for
(
int
i=1; i<5; i++)
04
{
05
NSString *isMain = [[NSThread currentThread] isMainThread]?@
"YES"
:@
"NO"
;
06
NSLog(@
" 1 ====% 2d %@ Main:%@"
,i,[NSThread currentThread],isMain);
07
}
08
}];
09
[firstVC gcdTestMethod:^{
10
for
(
int
i=1; i<5; i++)
11
{
12
NSString *isMain = [[NSThread currentThread] isMainThread]?@
"YES"
:@
"NO"
;
13
NSLog(@
" 2 ====% 2d %@ Main:%@"
,i,[NSThread currentThread],isMain);
14
}
15
}];
这里给6个不同实现和不同的结果:
======================== 1 ============================1
- (
void
)gcdTestMethod:(gcdBlockObject)oneGcdObject
2
{
3
if
(!_concurrentQ){
4
_concurrentQ =
5
dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6
// dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7
}
8
dispatch_async(_concurrentQ, oneGcdObject);
9
}
======================== 2 ============================
1
- (
void
)gcdTestMethod:(gcdBlockObject)oneGcdObject
2
{
3
if
(!_concurrentQ){
4
_concurrentQ =
5
dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6
// dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7
}
8
dispatch_sync(_concurrentQ, oneGcdObject);
9
}
======================== 3 ============================
1
- (
void
)gcdTestMethod:(gcdBlockObject)oneGcdObject
2
{
3
if
(!_concurrentQ){
4
_concurrentQ =
5
// dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6
dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7
}
8
dispatch_async(_concurrentQ, oneGcdObject);
9
}
========================= 4 ===========================
1
- (
void
)gcdTestMethod:(gcdBlockObject)oneGcdObject
2
{
3
if
(!_concurrentQ){
4
_concurrentQ =
5
// dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6
dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7
}
8
dispatch_sync(_concurrentQ, oneGcdObject);
9
}
========================= 5 ===========================
1
- (
void
)gcdTestMethod:(gcdBlockObject)oneGcdObject
2
{
3
// if (!_concurrentQ){
4
_concurrentQ =
5
dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6
// dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7
// }
8
dispatch_sync(_concurrentQ, oneGcdObject);
9
}
========================= 6 ===========================
1
- (
void
)gcdTestMethod:(gcdBlockObject)oneGcdObject
2
{
3
// if (!_concurrentQ){
4
_concurrentQ =
5
// dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT);
6
dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL);
7
// }
8
dispatch_async(_concurrentQ, oneGcdObject);
9
}
====================================================
1和2对比: DISPATCH_QUEUE_CONCURRENT 的queue 在使用sync时优先使用主线程(当前线程)
3和4对比: DISPATCH_QUEUE_SERIAL 的queue 无论使用sync还是aync都将遵循FIFO,但使用sync时优先使用主线程(当前线程)
5和6对比: DISPATCH_QUEUE_CONCURRENT 看似创建不同的queue 但由于都是使用sync,实际上都交给了主线程(当前线程),但不是同一个queue;而DISPATCH_QUEUE_SERIAL 看似没有遵循FIFO,实际是完全在两个不同的线程中执行的,这是由于的确创建了两个不同的queue。
Reference about dispatch_sync in "Grand Central Dispatch (GCD) Reference":
"As an optimization, this function invokes the block on the current thread when possible."
- 6个结果搞懂 GCD中 QUEUE 和 async/sync
- [IOS 开发] GCD中 QUEUE 和 async/sync
- GCD dispatch async / dispatch sync 介绍 。
- 刀哥多线程之gcd-01-sync&async
- mina中Half Sync/Half Async模式
- HttpClient实现同步(sync)和异步(Async)
- 彻底搞懂OC中GCD导致死锁的原因和解决方案
- GCD-Sync
- GCD基本概念和Dispatch Queue
- 【Verilog】 同步复位和异步复位比较 async vs. sync
- Half-Sync/Half-Async和Leader/Followers模式
- 关于JavaScript中的同步(SYNC)和异步(ASYNC)
- Sync & ASync
- Half-Sync/Half-Async
- Async vs sync benchmark
- golang中sync.RWMutex和sync.Mutex
- 并发编程之Operation Queue和GCD
- 并发编程之Operation Queue和GCD
- Fibnacci 序列
- ant安装过程
- Spring源码学习-容器初始化之FileSystemXmlApplicationContext(一)构造函数
- ssh 的移植
- Spinner 样式大全
- 6个结果搞懂 GCD中 QUEUE 和 async/sync
- A20在Linux中Livesuit不能烧写问题
- JDK源码学习--System.identityHashCode(Object)
- dwz框架 时间控件不支持onclick,onchange事件
- Win7 64位环境下JDK和Eclipse的选择与安装
- sendEmail发送带有附件的邮件
- objc_msgSend () 错误
- vim编辑器设定--鸟哥Linux私房菜基础篇
- 学习笔记:通过 objc_setAssociatedObject alert 和 button关联 及传值