同一个blockObject async
SSViewController *firstVC = (SSViewController *)self.window.rootViewController; [firstVC gcdTestMethod:^{ for (int i=1; i<5; i++) { NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO"; NSLog(@" 1 ====% 2d %@ Main:%@",i,[NSThread currentThread],isMain); } }]; [firstVC gcdTestMethod:^{ for (int i=1; i<5; i++) { NSString *isMain = [[NSThread currentThread] isMainThread]?@"YES":@"NO"; NSLog(@" 2 ====% 2d %@ Main:%@",i,[NSThread currentThread],isMain); } }];
这里给6个不一样实现和不一样的结果: this
======================== 1 ============================- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject { if (!_concurrentQ){ _concurrentQ = dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT); // dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL); } dispatch_async(_concurrentQ, oneGcdObject); }
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject { if (!_concurrentQ){ _concurrentQ = dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT); // dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL); } dispatch_sync(_concurrentQ, oneGcdObject); }
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject { if (!_concurrentQ){ _concurrentQ = // dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT); dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL); } dispatch_async(_concurrentQ, oneGcdObject); }
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject { if (!_concurrentQ){ _concurrentQ = // dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT); dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL); } dispatch_sync(_concurrentQ, oneGcdObject); }
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject { // if (!_concurrentQ){ _concurrentQ = dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT); // dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL); // } dispatch_sync(_concurrentQ, oneGcdObject); }
- (void)gcdTestMethod:(gcdBlockObject)oneGcdObject { // if (!_concurrentQ){ _concurrentQ = // dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_CONCURRENT); dispatch_queue_create(oneQueueName, DISPATCH_QUEUE_SERIAL); // } dispatch_async(_concurrentQ, oneGcdObject); }
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。
spa
Reference about dispatch_sync in "Grand Central Dispatch (GCD) Reference":
"As an optimization, this function invokes the block on the current thread when possible." 线程