dispatch_async
异步执行,异步就是在调用了dispatch_async这个函数后立即返回,不去管里面的任务到底是怎么样执行的。
主要功能
异步任务提交:dispatch_async() 是用于将任务块(block)提交到分发队列(dispatch queue)的核心机制。
特性
1.立即返回:调用 dispatch_async() 后会立即返回,不会等待任务块的实际执行。
2.任务执行模式:
目标队列决定了任务块是以串行(serial)还是并发(concurrent)方式执行。
串行队列:任务块按顺序依次执行。
并发队列:任务块可以同时执行。
3.队列间的并发性:
不同的串行队列之间是并发处理的。
dispatch_sync
同步任务提交,dispatch_sync() 将工作项(workitem)提交到分发队列(dispatch queue),并等待工作项完成后再返回。
1.同步等待:
调用 dispatch_sync() 后会等待工作项执行完毕才返回。
2.忽略队列属性:
提交的工作项在执行时不遵循目标队列的某些属性,如自动释放频率(autorelease frequency)和服务质量(QOS class)。
3.避免死锁:
将工作项提交到当前队列会导致死锁。因此,不建议在当前队列上使用 dispatch_sync()。
使用 dispatch_sync() 也可能导致多线程死锁问题,类似于使用互斥锁(mutex)时可能出现的情况。
通常推荐使用 dispatch_async() 来避免这些问题。
4.引用管理:
dispatch_sync() 不会对目标队列进行 retain 操作。由于调用是同步的,dispatch_sync() 会“借用”调用者的引用。
5优化执行:
作为优化,dispatch_sync() 通常会在提交工作项的线程上执行该工作项,除非传递的队列是主队列(main queue)或指向主队列的队列。
队列
1.并发队列
//手动创建了一个并发队列
dispatch_queue_t concurrentQueue2 = dispatch_queue_create("myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
// 获取全局并发队列
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.串行队列
//创建一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL);
//主队列也是一个串行队列
dispatch_get_main_queue()
执行+队列 组合结果
异步提交,代码块里面的内容是最后执行的
同步提交,会先执行代码块里面的内容
同步提交任务到串行队列,任务 按顺序依次执行
异步提交任务到串行队列,任务 按顺序依次执行
同步提交任务到并发队列,任务 按顺序依次执行
异步提交任务到并发队列,任务 并发执行
异步提交任务到不同的串行队列, 任务同时执行,因为不同的串行队列是并发的
主队列是一个串行队列
同步提交任务到主队列, 死锁
异步提交任务到主队列,先执行其他任务,最后在按顺序执行提交的任务