前天被人问到使用GCD
做依赖的用法,结果完全答不上来,下来之后就搜索了一下GCD
的高级用法,发现自己对于GCD
的掌握还很浅,像dispatch_group
和dispatch_barrier
的用法居然都不知道。
dispatch_group
就是用来解决依赖问题的,或者说是用来解决并发序列的顺序执行问题。主要有几个方法,分别是:
dispatch_group_t dispatch_group_create(void);
void dispatch_group_enter(dispatch_group_t group);
void dispatch_group_leave(dispatch_group_t group);
long dispatch_group_wait(dispatch_group_t group, dispatch_time_t timeout);
void dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
需要注意的就是,要先进入group
,然后在调用notify,否则可能会导致直接调用了notify回调。
dispatch_barrier
主要还是用于加锁,它主要用于有并发读写的需求时,正常使用dispatch_sync(dispatch_async)
执行读操作,在执行写操作时,使用dispatch_barrier_sync(dispatch_barrier_async)
,等于对写操作了添加了互斥锁,可以避免多线程同时执行写操作。这样做可以执行并发读操作,同时有互斥的执行写操作,相比全部添加互斥锁提高了访问性能。