1 GCD提供两种类型的queue,在
dispatch_queue_t queue = dispatch_queue_create(<#const char * _Nullable label#>, <#dispatch_queue_attr_t _Nullable attr#>)
第一个参数一般使用逆序全称域eg: com.example.customtypeQueue,第二个参数使用DISPATCH_QUEUE_SERIAL 或者 DISPATCH_QUEUE_CONCURRENT,一般只在引起资源竞争的操作是使用 DISPATCH_QUEUE_SERIAL类型的queue 来避免资源竞争,大部分情况下依然使用DISPATCH_QUEUE_CONCURRENT类型的queue.同步执行为顺序执行,按照添加任务的先后顺序顺序执行,并行执行不按照先后顺序,同时执行多个任务,
1 当向serial类型的queue使用dispatch_asyn多次添加任务后,任务的执行会按照添加的先后顺序顺序执行(串行),但是,当创建多个serial类型的queue时,并且给每个queue分别添加任务后,这些任务的执行顺序是不分先后的,即多个serial类型的queue之间依然是并行执行,互不影响;
(在手动创建的串行队列中添加异步(并发)执行的任务,任务的执行也是同步执行)
2 当向同一个concurrent类型的queue使用dispatch_asyn添加多个任务后,这些任务的执行是并行执行的;
(当向手动创建的并行队列中添加异步执行的任务,任务的执行是并行执行,多个任务之间部分先后顺序)
3 当向serial类型的queue使用sipatch_syn多次添加任务后,任务的执行按添加任务的先后顺序串行执行;
(当想手动创建的串行行队列中添加同步执行的任务,任务的执行仍然是同步执行)
4 当向concurrent类型的queue使用dispatch_syn添加多个任务时,多个任务依然是按照添加的先后顺序串行执行.
(当向手动创建的并行队列中添加同步执行的任务,任务的执行是同步执行)
除了使用自己创建的queue外,我们还可以使用系统提供的queue,dispatch_get_main_queue()方法获得当前程序的主线程,主线程只有一个,值得注意的是该线程属于DISPATCH_QUEUE_SERIAL类型,使用方法参考上述四点,另外还有dispatch_get_gloabal_queue(DISPATCH_QUEUE_PRIORITY_四种优先级,0)方法可以获得系统提供的四中不同优先级的queue,这四种类型的queue是DISPATCH_QUEUE_CONCURRENT类型,使用方法参考上述四点.
另外,OC中的三种暂停方法:sleep()函数和 [NSThread sleepForTimeInterval:]方法影响的是该函数所处的线程,并不一定是主线程 dispatch_after 方法一定是延迟的主线程类似于performSelector方法,使用NSTimer方法控制暂停在此就不过多描述了,网上很多. 后续会再次补上有关GCD更多的使用方法
//dispatch_set_target_queue
dispatch_set_target_queue(queue1, targetQueue)方法将制定queue的优先级设置为targetQueue一样的queue,若targetQueue的类型SERIAL,则根据该方法设置过的queue的先后顺序,顺序执行所有被设置过的queue,若挂起某一个queue,则其他queue的执行受阻;若targetQueue的类型为CONCURRENT类型,则并行执行所有被设置过的queue,若挂起某一个queue,不影响其他queue的执行.(线程挂起与恢复的方法:
//挂起
dispatch_suspend(<#dispatch_object_t _Nonnull object#>)
//恢复
dispatch_resume(<#dispatch_object_t _Nonnull object#>)
)dispatch_set_target_queue(queue1,targetQueue);
dispatch_set_target_queue(queue2,targetQueue);
dispatch_set_target_queue(queue3,targetQueue);
新闻热点
疑难解答