GCD外传:dispatch_once

dispatch_once的作用正如其名:对于某个任务执行一次,且只执行一次。 dispatch_once函数有两个参数,第一个参数predicate用来保证执行一次,第二个参数是要执行一次的任务block。

#1        static dispatch_once_t predicate;
#2        dispatch_once(&predicate, ^{
#3            // some one-time task
#4        });

1.第一次执行,block需要被调用,调用结束后需要置标记变量
2.非第一次执行,而此时#1尚未完成,线程需要等待#1完成
3.非第一次执行,而此时#1已经完成,线程直接跳过block而进行后续任务

对于场景#1,整体任务的效率瓶颈完全不在于dispatch_once,而在于block本身占用的cpu时间,并且也只会发生一次。

对于场景#2,发生的次数并不会很多,甚至很多时候一次都不会发生,假如发生了,那么也只是一个符合预期的行为:后来的线程需要等待第一线程完成。即使你写一个受虐型的单元测试来故意模拟场景#2,也不能说明什么问题,得不到的永远在骚动,被偏爱的都有恃无恐。

对于场景#3,在程序进行过程中,可能发生成千上万次或者天文数字次,这才是效率提升的关键之处,下面我将细细道来。

来源:http://www.dreamingwish.com/article/gcd-guide-dispatch-once-1.html

你可能感兴趣的:(GCD外传:dispatch_once)