美文网首页
iOS多任务核心GCD-分派队列

iOS多任务核心GCD-分派队列

作者: saintPN | 来源:发表于2016-03-15 14:02 被阅读0次

      GCD(Grand Central Dispatch)是iOS多任务的核心,广泛应用在iOS编程或者系统层面的各个方面。GCD是非常底层的框架,比操作队列更底层。GCD严格遵守先进先出(FIFO)结构,所以是无法在队列中使用优先级或者调整次序。

      首先最重要的一点,分派队列是队列,而不是线程。队列是组织块的,调用dispatch_async不会让块执行,只是把块添加到队列中。GCD中队列是有层级的,事实上只有全局系统队列会被调度运行,访问方法是:dispatch_get_global_queue,以及下面优先级常量中的一个:

    DISPATCH_QUEUE_PRIORITY_HIGH

    DISPATCH_QUEUE_PRIORITY_DEFAULT

    DISPATCH_QUEUE_PRIORITY_LOW

    DISPATCH_QUEUE_PRIORITY_BACKGROUND

      这些队列都是并行的,GCD会根据可用线程尽可能按优先级调度队列。当我们创建队列时,队列会附加到某一个全局队列。默认情况下会附加到默认优先级队列上。当块到达头部时,实际上会移动目标队列的末尾。当到达全局队列的头部时就会执行。块被添加后,就会按照顺序运行,无法取消,也无法改变相对于队列中其他块的顺序。但是如果想让高优先级块插队呢?如下代码。创建两个队列,一个高优先级和一个低优先级,使高优先级队列是低优先级队列的目标队列:

    dispatch_queue_t low = dispatch_queue_create("low",DISPATCH_QUEUE_SERIAL);

    dispatch_queue_t high = dispatch_queue_create("high",DISPATCH_QUEUE_SERIAL);

    dispatch_set_target_queue(low,high);

      通常是分派到低优先级队列:

    dispatch_async(low,^{/ 低优先级块 /});

      要分派到高优先级队列,暂停低优先级队列,并且在高优先级块结束后恢复低优先级队列:

    dispatch_suspend(low);

    dispatch_async(high,^{

    / 高优先级块 /

    dispatch_resume(low);

    });

      暂停队列会组织调度开始就处于其中的任何块,还有人和以暂停队列为目标队列的队列。这样不会停止正在执行的块,但是就算低优先级块是CPU执行的下个目标,也不会被调度,直到resume。suspend和resume必需配对出现。

    相关文章

      网友评论

          本文标题:iOS多任务核心GCD-分派队列

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