zoukankan      html  css  js  c++  java
  • GCD,大家都知道的回顾

    GCD,自iOS4.0吧,比block还要早,他的用处主要是体现在线程方面,比如你有个比较麻烦的而且循环比较大的代码段什么,比如有个后台下载什么的,这都必须放在子线程里一个放在子线程里执行,为了不影响用户体验!

    来说说几个很基本的东西方便了解:

    串行

    系统默认就有一个串行队列main_queue,也就是主线程所在的队列,因为是串行,所以可以认为通过这个回到主线程

    自定义dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
                                DISPATCH_QUEUE_CONCURRENT);(queueName 自定义的串行队列的名称)

    执行一般是dispatch_get_main_queue()

     

    并行

    系统默认就有一个并行队列global_queue

    自定义dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
                                DISPATCH_QUEUE_SERIAL);

    关于并行,有个优先级的问题,看看系统给的,2,0 ,-2 和最小。。。

    #define DISPATCH_QUEUE_PRIORITY_HIGH 2

    #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

    #define DISPATCH_QUEUE_PRIORITY_LOW (-2)

    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

    执行一般是dispatch_get_global_queue(这里是填优先级, 这个值可以看说明默认是0);

    一般经常干的事是什么呢

    dispatch_async(这里是并发, ^{

      // long-running task code here
            dispatch_async(这里是串行,^{

          //update UI code here

              });
        });

    线程的延时操作

    dispatch_time(DISPATCH_TIME_NOW(这个是以程序执行的时间点), seconds * NSEC_PER_SEC(这里是设定精确级别的));

    dispatch_after(dispatch_time_t when(这个就是上面生成的一个time),dispatch_queue_t queue(队列),dispatch_block_t block(延迟执行的语句));

    线程组

    dispatch_group_create()创建一个组

    可以用来监控一个group里的内容是否执行完成

    dispatch_group_notify(dispatch_group_t group,

                dispatch_queue_t queue,

                dispatch_block_t block);

    很奇特的GCD,不是么,group是一个个执行的,但是在这其中,不管你是并行或串行,根本就不会按你所想的规矩来,特别是并发的,当你加入一个group里面他可不会按你代码排的顺序来执行(包括串行),但是最终肯定会执行dispatch_group_notify参数里面的block语句。

    GCD定时器

    写成一个内联函数

    NS_INLINE dispatch_source_t GCD_create_timer(int64_t seconds, dispatch_queue_t queue, void (^block)(dispatch_source_t timer))
    {
        //创建Timer
       
        dispatch_source_t _timer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        
        //使用dispatch_source_set_timer函数设置timer参数
        dispatch_source_set_timer(_timer,
                                        dispatch_time(DISPATCH_TIME_NOW, 0),
                                        seconds * NSEC_PER_SEC,
                                        0);
          
        //设置回调
        dispatch_source_set_event_handler(_timer, ^(){
                                              block(_timer);
                                          });
        
        //dispatch_source默认是Suspended状态,通过dispatch_resume函数开始它
        dispatch_resume(_timer);
        return _timer;
    }

    用完记得释放,否则。。。。(ARC可以不考虑,看看里面的实现吧!)

     

    至于同步的。。。你觉得这有讨论的必要么,好吧,我确实不知道同步用在那些地方!

     

  • 相关阅读:
    c# vs2010 excel 上传oracle数据
    Viola-Jones人脸检測
    apache commons-configuration包读取配置文件
    linux 读取文件
    linux 统计某个文件的行数
    linux 判空处理
    linux 查看某个目录下文件的数量
    nginx 配置文件正确性测试
    使用postman上传excel文件测试导入excel
    java 反射获取字段为List类型中的泛型类型
  • 原文地址:https://www.cnblogs.com/lingzhiguiji/p/3709592.html
Copyright © 2011-2022 走看看