dispatch_sync】的更多相关文章

平常开发中会经常用gcd做一下多线程任务,但一直没有对同步.异步任务在串行.并行队列的执行情况做个全面的认识,今天写了个demo跑了下,还是有些新发现的. 代码如下: - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{       [self gcdTest]; }   -(void)gcdTest {       dispatch_queue_t serialQueue= dispatch_…
以下代码会引起死锁 dispatch_block_t block = ^{ ; i < ; i++) { NSLog(@"dispatch_sync:%d", i); } }; dispatch_queue_t queue = dispatch_queue_create(); dispatch_async(queue, block); NSLog(@"finish dispatch_asyn"); dispatch_sync(dispatch_get_main…
Clear that! dispatch_async 是将block发送到指定线程去执行,当前线程不会等待,会继续向下执行. dispatch_sync 也是将block发送到指定的线程去执行,但是当前的线程会阻塞,等待block在指定线程执行完成后才会继续向下执行. 所以为什么 dispatch_sync 使用不当时,容易对当前线程造成死锁就容易分析了~ dispatch_sync 和 dispatch_async 将block加入到指定线程中后,指定线程都是串行执行的,既FIFO. 所以说…
为什么要写这个系列,由于百度了一下.我们正在寻找一个非常比较片面的Blog.抄来抄去,写作是很粗糙. 所以,我想写这个系列,尝试记录官方网站GCD强大的全功能的表达.为了方便他们,也方便他人,假设有发现一个问题,欢迎 该教程程序:完整的看过GCD的官方文档之后.我实在想不出来怎样用一篇文章具体完整的写出来如此多的功能. 所以.决定开一个专栏来写这个教程. 计划8篇文章,分别介绍各种功能,每种功能会附上简单完整的演示样例代码. 最后 的一篇文章会进行总结.总结出GCD的经典使用场景.源码仅仅提供S…
dispatch_sync 线程同步.dispatch_async线程异步 比如 //同步 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{ NSLog(@"dispatch_sync - 1"); }); dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{ NSLog(@&…
- (BOOL)transitionToNextPhase { // 保证代码在主线程 if (![[NSThread currentThread] isMainThread]) { dispatch_sync(dispatch_get_main_queue(),^{ [self transitionToNextPhase]; }); return YES; } //后续执行代码 }…
dispatch_sync(),同步添加操作.他是等待添加进队列里面的操作完成之后再继续执行. dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_sync(concurrentQueue, ^(){ NSLog(@"2"); [NSThre…
dispatch_sync(),同步添加操作.他是等待添加进队列里面的操作完成之后再继续执行. dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT); NSLog("); dispatch_sync(concurrentQueue, ^(){ NSLog("); [NSThread sleepForTimeI…
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"2"); }); NSLog(@"3"); } 上面的代码只会打印1 然会就会线程卡死,这是为什么呢? 因为dispatch_get_main_queue()得到的是一个串行队列,串行队列的特点: 一次只调度一个任务,队列中的任务一个…
大家的知道在主队列上使用dispatch_sync(), - (void)testSyncMainThread { dispatch_queue_t main = dispatch_get_main_queue(); NSLog(@"*********1"); dispatch_sync(main, ^(){ NSLog(@"*********2"); }); NSLog(@"*********3"); } 会造成线程阻塞,但是查找网上说的原因,…