GCD全程Grand Central Dispatch
摒弃掉了线程中复杂的创建线程和开启线程的繁琐。只需要关注最关键的两个步骤:任务和队列
同步方式执行任务:
dispatch_sync
异步的方式执行任务:
dispatch_async
区别:同步:只能在当前线程中执行任务,不具备开启新线程的能力
异步:可以在新的线程中执行任务,具备开启新的线程的能力
队列:并发队列 :可以让多个任务同时进行(自动开启多个线程同时执行任务)
并发功能只在异步(dispatch_async)函数下才有效
串行队列 :让任务一个接着一个进行,一个任务完成才能执行下一个任务。
四种队列组合:
异步并发: dispatch_async +DISPATCH_QUEUE_CONCURRENT可以同时开启多条线程。
同步并发:dispatch_sync +DISPATCH_QUEUE_CONCURRENT 不会创建新的线程(并发并未体现出来,实现效果和同步串行一样,但是会更加消耗性能。)
异步串行:dispatch_async+DISPATCH_QUEUE_SERIAL 会开启新的线程,但是执行完一个任务才回执行下一个。
同步串行:dispatch_sync+DISPATCH_QUEUE_SERIAL 不会开启新的线程且任务按顺序执行完。
主队列: dispatch_get_main_queue + 异步 不管是不是并行还是串行,都会放至主线程中执行!
dispatch_get_main_queue + 同步 会导致卡死。
GCD中保证代码在整个程序中至运行一次: dispatch_once(&onceToken,^ {
// 只运行一次的代码
});
网友评论