• 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, ^{
            
        });

     

          

  • 相关阅读:
    java多线程(同步与死锁问题,生产者与消费者问题)
    剑指OFFER之跳台阶(九度OJ1388)
    剑指OFFER之二维数组中的查找(九度OJ1384)
    剑指OFFER之旋转数组的最小数字(九度OJ1386)
    我所思考的生活,致半年后的自己
    剑指OFFER之用两个栈实现队列(九度OJ1512)
    剑指OFFER之二维数组中的查找(九度OJ1384)
    剑指OFFER之重建二叉树(九度OJ1385)
    简单的客户机服务器投射模拟
    网络复习之TCP
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/4920136.html
Copyright © 2020-2023  润新知