首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dispatch_sync与主队列上的dispatch_async

是GCD(Grand Central Dispatch)中的两种任务调度方式。

  1. dispatch_sync:是同步执行任务的方式。它会阻塞当前线程,直到任务执行完成才会继续执行后续代码。dispatch_sync可以用于串行执行任务或者在并行队列中等待任务完成。
  2. 主队列上的dispatch_async:主队列是一个特殊的串行队列,用于在主线程上执行任务。dispatch_async会将任务异步地提交到主队列中,不会阻塞当前线程,而是立即返回,任务会在主队列中按顺序执行。

这两种方式的区别在于任务的执行方式和线程的阻塞情况。dispatch_sync会阻塞当前线程,直到任务执行完成,适用于需要等待任务结果的情况。而主队列上的dispatch_async则是异步执行任务,不会阻塞当前线程,适用于不需要等待任务结果的情况。

应用场景:

  • dispatch_sync:适用于需要等待任务完成并获取结果的情况,例如在主线程中等待子线程任务完成后更新UI。
  • 主队列上的dispatch_async:适用于在主线程中异步执行任务,例如在主线程中执行耗时较长的任务,避免阻塞UI响应。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS学习——(转)多线程

我们运用多线程目的是:将耗时操作放在后台执行! 二、线程状态生命周期   下图是线程状态示意图,从图中可以看出线程生命周期是:新建 - 就绪 - 运行 - 阻塞 - 死亡。 ?   ...; 五、GCD理解使用 No.1:GCD特点 GCD会自动利用更多CPU内核 GCD自动管理线程生命周期(创建线程,调度任务,销毁线程等) 程序员只需要告诉 GCD 想要如何执行什么任务...GCD总结:将任务(要在线程中执行操作block)添加到队列(自己创建或使用全局并发队列),并且指定执行任务方式(异步dispatch_async,同步dispatch_sync) No.3:队列创建方法...主队列同步造成死锁原因: 如果在主线程中运用主队列同步,也就是把任务放到了主线程队列中。 而同步对于任务是立刻执行,那么当把第一个任务放进主队列时,它就会立马执行。...主队创建如下,主队列上任务是在主线程执行

1.1K20

iOS 多线程总结

如果不是添加到主队列上,异步会在子线程中执行任务 dispatch_queue_t queue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT...,他相关共有三个函数,分别是 dispatch_semaphore_create,dispatch_semaphore_signal,dispatch_semaphore_wait。...2、产生死锁条件: 产生死锁四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。...同步对于任务是立刻执行,那么当把任务放进主队列时,它就会立马执行,只有执行完这个任务,viewDidLoad才会继续向下执行。...而viewDidLoad和任务都是在主队列上,由于队列先进先出原则,任务又需等待viewDidLoad执行完毕后才能继续执行,viewDidLoad和这个任务就形成了相互循环等待,就造成了死锁。

72550

多线程和GCD

在串行队列只开启一条线程 在并发队列开启多条线程 主队主队列是和主线程相关联队列,主队列是GCD自带一种特殊串行队列,放在主队列中任务,都会放到主线程中执行。...= dispatch_get_main_queue(); //把任务添加到主队列中执行 dispatch_async(queue, ^{ NSLog(@"使用异步函数执行主队列中任务...1--%@",[NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"使用异步函数执行主队列中任务2--%@",...[NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"使用异步函数执行主队列中任务3--%@",[NSThread...也就是说死锁条件是因为dispatch_sync()方法在等待Block执行完毕,而Block在等待dispatch_sync()方法往下执行才能轮到它。

1.1K10

深入理解GCD

注意若你需要来自某个方法数据,你必须内联另一个 Block 来找回它或考虑使用 dispatch_sync主队列(串行):这是在一个并发队列上完成任务后更新 UI 共同选择。...以及,如果你在主队列调用 dispatch_async主队列,你能确保这个新任务将在当前方法完成后某个时间执行。 并发队列:这是在后台执行非 UI 工作共同选择。...自定义串行队列:在一个自定义串行队列上使用 dispatch_after 要小心。你最好坚持使用主队列。...主队列(串行):是使用 dispatch_after 好选择;Xcode 提供了一个不错自动完成模版。 并发队列:在并发队列上使用 dispatch_after 也要小心;你会这样做就比较罕见。...主队列(串行):上面一样,在串行队列上不适合使用 dispatch_apply 。还是用普通 for 循环吧。 并发队列:对于并发循环来说是很好选择,特别是当你需要追踪任务进度时。

1.4K10

多线程(二):GCD

1、添加任务到队列(同步、异步): dispatch_sync: 同步添加,将指定任务block同步追加到queue中,在追加block结束之前,dispatch_sync会一直等待; 如果在主线程上执行同步任务...(任务也在主线程执行),会造成死锁: //会造成死锁 dispatch_sync(dispatch_get_main_queue(), ^{ // }); 但是在异步任务里可以用来切换到主线程 dispatch_async...主队列(main): dispatch_queue_t mainQ = dispatch_get_main_queue() 注意:不能sync向主队列提交任务,因为会造成死锁,只能async提交任务 全局队列...DISPATCH_TIME_NOW,150ull *NSEC_PER_MSEC),dispatch_get_main_queue(), ^{ //毫秒 }); 4、dispatch_groupdispatch_barrier...dispatch_async(queue, ^{NSLog(@"read");}); dispatch_async(queue, ^{NSLog(@"read");}); #可以保证写时候只有这一个操作

37520

GCD概念和基本使用GCD概念和基本使用

是苹果公司为多核并行运算提出解决方案; GCD 会自动利用更多CPU内核(比如双核、四核) GCD 会自动管理线程生命周期(创建线程、调度任务、销毁线程) 总结:将任务添加到队列,并且指定执行任务函数...通过dispatch_async(queue , {})获取; 不用等待当前语句执行完毕,就可以执行下一条语句 会开启线程,异步就是多线程代名词; 1.3 GCD队列 主队列 通过dispatch_get_main_queue...2、GCD使用 2.1 创建 同步函数 dispatch_sync(dispatch_get_main_queue();, ^{ }); 异步函数 dispatch_async(dispatch_get_main_queue...();, ^{ }); 主队列 dispatch_get_main_queue(); 全局并发队列 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH...queue = dispatch_queue_create("HRTest", NULL); dispatch_sync(queue, ^{ dispatch_sync(queue

95220

GCD 概念解释方法:

同步:你必须把我代码执行完你再走,一定要执行完同步里代码再执行下面的代码 void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block...主队列: 遇到主队列,不管同步异步都要先执行完主线程里代码再执行主队列里代码 dispatch_sync方法不能在主队列中调用,因为这会无限期阻止线程并会导致你应用死锁。...主队特点:先执行完主线程上代码,才会执行主队列中任务 1、添加到主队任务只能由主线程来执行。 2、以先进先出方式,只有当主线程代码执行完毕后,主队列才会调度任务到主线程执行。...同步:你必须把我代码执行完你再走,一定要执行完同步里代码再执行下面的代码 void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block...例子:将任务同步添加到队列和将任务异步添加到队列 (1)dispatch_sync(queue, task); (2)dispatch_async(dispatch_get_global_queue(0

834130

阿里、字节:一套高效iOS面试题( 多线程 GCD底层原理篇)

比如 int a = 1 或者 NSLog(@"log"); 执行任务有两种方式:同步执行(**dispatch_sync 异步执行(**dispatch_async**)**。...一些 UI 无关操作应该放到全局队列来执行,而不是主队列。比如网络请求这类操作。...同步异步最大区别就在于是否会阻塞当前线程: dispatch_sync 会阻塞当前线程。 dispatch_async 不会阻塞当前线程。...dispatch_apply 在各队列上表现(当前为主线程): 主队列:死锁(毕竟这是同步执行); 串行队列:串行队列会完全抵消 dispatch_apply 并行迭代功能,还不如 for 循环;...看看dispatch_barrier_sync dispatch_sync 至于 dispatch_barrier_sync dispatch_sync

4.2K50

iOS多线程——你要知道GCD都在这里你要知道iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

iOS多线程——RunLoopGCD、AutoreleasePool GCD使用姿势全解 经过前一篇文章学习,可以发现直接使用NSThread来编写多线程程序有不少问题,线程在执行完成后就会退出,...(void); /* 获取主队列,即主线程相关联队列 如果需要提交任务到主线程使用该方法获取主线程主队列即可 主队列是串行队列因为只维护主线程一个线程 */ dispatch_queue_t dispatch_get_main_queue...到此为止,四个实验都结束了,没有单独把主队列拿出来做实验,因为主队列本质还是一个串行队列,其实验结果和串行队列是一样。...dispatch_barrier_async方法常并发队列共用,前一段任务使用dispatch_async异步并发执行,然后插入一个dispatch_barrier_async执行一个中间任务,这个中间任务必须要等待前面的并发任务执行完成后才能开始执行...前文举几个串行队列栗子很多是不能使用主队,原因也正在此。

1.9K100

iOS 多线程:『GCD』详尽总结(二)

任务是按顺序执行(串行队列每次只有一个任务被执行,任务一个接一个按顺序执行)。 下边讲讲刚才我们提到过特殊队列:主队列。...主队列:GCD自带一种特殊串行队列 所有放在主队列中任务,都会放到主线程中执行 可使用dispatch_get_main_queue()获得主队列 我们再来看看主队两种组合方式。...: 所有任务都是在主线程(非当前线程)中执行,没有开启新线程(所有放在主队列中任务,都会放到主线程中执行)。...syncMain 任务在其他线程中执行到追加任务1到主队列中,因为主队列现在没有正在执行任务,所以,会直接执行主队任务1,等任务1执行完毕,再接着执行任务2、任务3。所以这里不会卡住线程。...: 所有任务都是在当前线程(主线程)中执行,并没有开启新线程(虽然异步执行具备开启线程能力,但因为是主队列,所以所有任务都在主线程中)。

53670

iOS-多线程详解

(跟主线程相关联队列) 主队列是GCD自带一种特殊串行队列,放在主队列中任务,都会放到主线程中执行 //1.获得主队列 dispatch_queue_t queue = dispatch_get_main_queue...}); 同步函数+主队列:死锁 //1.获得主队列 dispatch_queue_t queue = dispatch_get_main_queue(); //2.同步函数 dispatch_sync...使用同步或异步函数,传入主队列即可。...4.2 NSOperationQueue使用 NSOperation中两种队列 主队列:通过mainQueue获得,凡是放到主队列中任务都将在主线程执行 非主队列:直接alloc init出来队列...立刻就会执行block块中代码 // block中代码op1不一定在一个线程中执行,但是一定在子线程中执行 op1.completionBlock = ^{ NSLog(@"op1

1.7K90

iOS——GCD死锁案例

串行并行 在使用GCD时候,我们会把需要处理任务放到Block中,然后将任务追加到相应队列里面,这个队列,叫做Dispatch Queue。...举一个简单例子,在三个任务中输出1、2、3,串行队列输出是有序1、2、3,但是并行队列先后顺序就不一定了。 同步异步 串行并行针对是队列,而同步异步,针对则是线程。...表示是一个同步线程; dispatch_get_main_queue表示运行在主线程中主队列; 任务2是同步线程任务。...从dispatch_get_global_queue可以看出,任务2被加入到了全局并行队列中,当并行队列执行完任务2以后,返回到主队列,继续执行任务3。...Demo5 dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); // 任务1 dispatch_sync(

1.9K30

iOS - 多线程(三):GCD

dispatch_async(queue, block); 1.3 GCD 执行任务方式 1.3.1 同步 dispatch_sync 提交一个 block 对象到指定队列以同步执行...,block会被自动copyrelease; * 该block没有返回值,也没有参数; * 此参数不能为空(NULL) */ void dispatch_sync(dispatch_queue_t...如在主队列异步执行,不会开启新线程,因为主队任务在主线程上执行) 1.4 GCD 队列 1.4.1 GCD 队列介绍 Dispatch Queue: 一个用于管理主线程或子线程上串行或并发执行任务对象...主队列(dispatch_queue_main_t) 主队列是一种特殊串行队列,它特殊在主线程关联,主队任务都在主线程上执行,主队列在程序一开始就被系统创建并与主线程关联。...示例1: /* 队列特点:FIFO (First In First Out) 先进先出 以下将 block(任务2)提交到主队列,主队列将来要取出这个任务放到主线程执行。

2.2K31

iOS 多线程:『GCD』详尽总结(一)

(可以开启多个线程,并且同时执行任务) 注意:并发队列并发功能只有在异步(dispatch_async)函数下才有效 两者具体区别如下两图所示。 3....所有放在主队列中任务,都会放到主线程中执行。 可使用dispatch_get_main_queue()获得主队列。...; 3.2 任务创建方法 GCD 提供了同步执行任务创建方法dispatch_sync和异步执行任务创建方法dispatch_async。...// 同步执行任务创建方法 dispatch_sync(queue, ^{ // 这里放同步执行任务代码 }); // 异步执行任务创建方法 dispatch_async(queue, ^{...5.同步执行 + 主队列 6.异步执行 + 主队列 那么这几种不同组合方式各有什么区别呢,这里为了方便,先上结果,再来讲解。你可以直接查看表格结果,然后跳过 4. GCD基本使用 。

47850

iOS多线程:『GCD』详尽总结

所有放在主队列中任务,都会放到主线程中执行。 可使用dispatch_get_main_queue()获得主队列。...; 3.2 任务创建方法 GCD 提供了同步执行任务创建方法dispatch_sync和异步执行任务创建方法dispatch_async。...// 同步执行任务创建方法 dispatch_sync(queue, ^{ // 这里放同步执行任务代码 }); // 异步执行任务创建方法 dispatch_async(queue, ^{...主队列:GCD自带一种特殊串行队列 所有放在主队列中任务,都会放到主线程中执行 可使用dispatch_get_main_queue()获得主队列 我们再来看看主队两种组合方式。...syncMain 任务在其他线程中执行到追加任务1到主队列中,因为主队列现在没有正在执行任务,所以,会直接执行主队任务1,等任务1执行完毕,再接着执行任务2、任务3。所以这里不会卡住线程。

93170

iOS多线程:GCD使用介绍

// 串行队列创建方法 2. 任务创建方法 GCD 提供了同步执行任务创建方法 dispatch_sync 和异步执行任务创建方法 dispatch_async。...// 同步执行任务创建方法 dispatch_sync(queue, ^{ // 这里放同步执行任务代码 }); // 异步执行任务创建方法 dispatch_async(queue, ^{...// 这里放异步执行任务代码 }); 虽然使用 GCD 只需两步,但是既然我们有两种队列(串行队列 / 并发队列),两种任务执行方式(同步执行 / 异步执行),如果当前代码默认放在主队列中,我们也有两种特殊组合方式...这四种不同组合方式是: 同步执行 + 并发队列 异步执行 + 并发队列 同步执行 + 串行队列 异步执行 + 串行队列 同步执行 + 主队列 异步执行 + 主队列 我们先来考虑最基本使用,也就是当前线程为...『主线程』中,『不同队列』+『不同任务』简单组合区别: 任务 并发队列 串行队列 主队列 同步(sync) 没有开启新线程,串行执行任务 没有开启新线程,串行执行任务 死锁卡住不执行 异步(async

1.1K30
领券