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

 

      

posted @ 2015-10-29 12:39  墨VS雪  阅读(268)  评论(0编辑  收藏  举报