zoukankan      html  css  js  c++  java
  • IOS之GCD

    GCD是Grand Central Dispatch的简称,它是基于语言的,用来解决多核并行运算。使用GCD,线程完全由系统进行管理,不需要再编写线程代码。

    GCD的核心是:将长期运行的任务拆分成多个工作单元,并将这些单元添加到dispatch queue中,系统会为我们管理这些dispatch queue,为我们在多个线程上执行工作单元,我们不需要直接启动和管理后台线程。

    dispatch queue严格遵循FIFO原则

    serial dispatch queue执行串行任务

    concurrent dispatch queue执行并发任务

    系统会给每个应用提供三个并发dispatch queue,三个queue的区别是优先级。使用dispatch_get_global_queue函数来获取这三个queue:

    //获取默认优先级的全局dispatch queue
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    

     第一个参数用于指定优先级,分别使用DISPATCH_QUEUE_PRIORITY_HIGH和DISPATCH_QUEUE_PRIORITY_LOW两个常量来获取高和低优先级的两个queue;第二个参数目前未使用到,默认0即可。

    使用dispatch_queue_create来创建串行queue:

    dispatch_queue_t queue = dispatch_queue_create("queue name", NULL);//第二个参数是queue属性
    

    dispatch_get_current_queue获取当前queue

    dispatch_get_main_queue获取主线程关联的串行queue

    dispatch_get_global_queue获取全局共享的并发queue

    异步添加任务:dispatch_async、dispatch_async_f

    同步添加任务:dispatch_sync、dispatch_sync_f

    并发迭代:dispatch_apply、dispatch_apply_f

    可以使用dispatch_apply替代for循环

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    size_t count = 10;
    dispatch_apply(count, queue, ^(size_t i) {
        printf("%zd", i);    
    });
    

     dispatch_apply和dispatch_apply_t在迭代执行完后才返回,会阻塞当前线程,可以考虑在其他线程中异步执行。

    dispatch group

    使用dispatch_group_async函数将多个任务关联到一个Dispatch Group和相应的queue中,group会并发地同时执行这些任务。而且Dispatch Group可以用来阻塞一个线程, 直到group关联的所有的任务完成执行。

  • 相关阅读:
    web高级第一节
    Socket网络编程
    redis第三节
    redis第二节
    Git(2)
    Xamarin.Android 应用程序配置
    Android--ListView与数据绑定(Xamarin)
    Android--Activity(活动)
    Xamarin Android 真机调试时闪退
    wpf 将Style应用到 ListView 中的 ListViewItem 元素
  • 原文地址:https://www.cnblogs.com/sfce/p/4341694.html
Copyright © 2011-2022 走看看