zoukankan      html  css  js  c++  java
  • GCD多线程的实现方法

     

          GCD的多线程实现:

          优点:便于使用

          不同队列的优先级:

        DISPATCH_QUEUE_PRIORITY_DEFAULT  第二优先级
        DISPATCH_QUEUE_PRIORITY_HIGH 最高优先级
        DISPATCH_QUEUE_PRIORITY_LOW  第三优先级
        DISPATCH_QUEUE_PRIORITY_BACKGROUND  最低优先级

        主队列:更新UI。

    /创建子线程
        [self senddate];//发送网络请求
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //调用主线程,在主线程中更新ui
            dispatch_async(dispatch_get_main_queue(), ^{
                [self updateUI];//更新UI
            });
        });

        全局队列:

    //创建gcd全局队列
        dispatch_queue_t myqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);//保留参数flag,一般传0
        //通过异步方式运行队列任务
        dispatch_async(myqueue, ^{
            [self senddate];
        });

        自定义队列:

    //创建gcd自定义队列
        dispatch_queue_t myqueue1 = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT);//第一个参数传一个队列标识符
        dispatch_async(myqueue1, ^{
            [self senddate];
        });

        GCD的延迟队列:

    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 2);//延时两秒
        dispatch_after(time, dispatch_get_main_queue(), ^{
            [self senddate];
        });

         GCD的重复队列:

      //重复队列
        //同步函数,会阻塞线程
        dispatch_apply(3.0, dispatch_get_global_queue(0,0), ^(size_t index) {
            NSLog(@"%zu",index);
        });

        GCD的组队列:

        自定义一个组队列,在组队列中的所有队列都完成之后,在执行组队列notify中的任务,相当于对组队列中的队列进行了监听

    //组队列
        //创建组队列
        dispatch_group_t mygroup = dispatch_group_create();
        //组1
        dispatch_group_async(mygroup, myqueue, ^{
            [self senddate];
        });
        //组2
        dispatch_group_async(mygroup, myqueue, ^{
            [self updateUI];
        });
        //执行完上诉两个队列后,再打印加载完毕
        dispatch_group_notify(mygroup, dispatch_get_main_queue(), ^{
            NSLog(@"加载完毕");
        });

         组内等待队列

    //直到关联组内的所有的任务完成后,再执行下面的操作。也可以用dispatch_time_t设置等待时间来完成操作
        dispatch_group_wait(mygroup, DISPATCH_TIME_FOREVER);

         暂停队列和恢复队列

      //暂停队列
        dispatch_suspend(myqueue);//无法暂停主队列和系统提供的队列,如果队列已经加载到主队列中,是无法暂停的。
        //恢复队列
        dispatch_resume(myqueue);

         单例,保证线程安全,在整个线程中 只执行一次,我在单例模式那篇文章中已有详细说明

    +(single *)share
    {
        static single *instance;
        //保证方法体里面代码只能运行一次
        dispatch_once_t once = 0;
        dispatch_once(&once, ^{
            if (instance == nil) {
                instance = [[single alloc]init];
                NSLog(@"%@",instance);
            }
        });
       
        return instance;
    }

          并行队列的阻塞队列:

    //等待dispatch_barrier_async队列前面的队列完成之后才会执行dispatch_barrier_async队列,然后再执行它下面的队列。dispatch_barrier_async队列最好是自定义的队列,应为它自身会阻塞线程,如果用主队列,对系统本身的队列并不好。
        dispatch_barrier_async(myqueue, ^{
            
        });

     

          

  • 相关阅读:
    Elasticsearch学习系列之介绍安装
    Python学习系列之文件操作
    Python学习系列之异常处理
    Python学习系列之装饰器
    windows 修改xhsell安全加密配置
    ipv6nginx错误
    zabbix 硬盘状态收集,制作表格
    申请免费ssl证书
    gitlab 搭建与迁移
    mogilefsdBUG mogilefsd[15624]: crash log: Modification of a read-only value attempted at /usr/local/share/perl5/Sys/Syscall.pm line 227
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/4920136.html
Copyright © 2011-2022 走看看