美文网首页
GCD外传:dispatch_once

GCD外传:dispatch_once

作者: 213dfddbef5e | 来源:发表于2017-03-27 19:11 被阅读11次

    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

          本文链接:https://www.haomeiwen.com/subject/hporottx.html