码迷,mamicode.com
首页 > Windows程序 > 详细

GCD中一些API的使用

时间:2015-07-13 14:14:51      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:queue   ios   并发   

GCD中一些API的使用

1.串行队列和并行队列

iOS中线程分为串行队列和并行队列,串行队列指的是任务按照先后顺序,依次执行;并行队列指的是任务不按照加入的先后顺序,并发的执行。
iOS中串行队列通过如下方式进行创建

dispatch_queue_t queue = dispatch_queue_create("cn.bourbonz.www", DISPATCH_QUEUE_SERIAL);

需要注意的是,引号中的内容表示的是对该队列的描述,后面的参数代表的是串行队列。
并行队列通过如下方式进行创建

dispatch_queue_t queue = dispatch_queue_create("cn.bourbonz.www", DISPATCH_QUEUE_CONCURRENT);
或者
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

第一种方式中,第一个参数表示对该队列的描述,后一个参数表示这是一个并行队列.
第二种方式中,这个队列创建的是一个全局类型的并行队列,第一个参数表示当前队列的优先级,第二个参数含义未知。
需要注意的是,GCD是C语言系的东西,所以不遵循ARC机制。当创建队列用到

dispatch_queue_create

这个方法的时候,需要在该队列在不用时,进行释放

dispatch_release

2.变更队列的优先级

队列创建后的优先级是可以更改的,使用到的方法

dispatch_set_target_queue(dispatch_object_t object, dispatch_queue_t queue);

这里面是将第一个队列改成第二个队列的优先级

3.dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    });

这个方法是将任务n秒后加入队列,不是任务加入队列后n秒后执行,所以这里需要注意的是,如果前面的任务阻塞了,那么这里的时间可能就不准确了。

4.dispatch_group

这个方法是将多个队列的任务都执行完之后才进行下面的操作,执行代码如下

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{

    });
    dispatch_group_async(group, queue, ^{

    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    });

5.dispatch_barrier_async

在对文件读写过程中,读和写操作只能单一进行,读操作可以分开同时执行。
在GCD中可以通过此方法,在并行队列中快速对文件进行读写操作,该方法进行的操作是,只有此方法的事件处理完成之后,才进行后面的操作,这样就可以将读写操作分开

    dispatch_async(queue, ^{
        //读
    });
    dispatch_async(queue, ^{
        //读
    });
    dispatch_async(queue, ^{
        //读
    });

    dispatch_barrier_async(queue, ^{
       //写
    });
    dispatch_async(queue, ^{
        //读
    });
    dispatch_async(queue, ^{
        //读
    });

6.dispatch_sync

既然函数名包含了async(异步的意思),那么就应该有sync的函数。
异步队列方法是指不用等待函数的返回结果,就可以执行下去;
同步队列方法是指需要等待函数的返回结果,也就是必须要等到函数处理完才能继续执行。
那么在使用的过程中稍有不慎,就有可能会出现死锁的情况,比如如下情况

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"123");

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"123");

        });

    });

7.dispatch_apply

GCD中提供了循环方法,可以通过此方法进行快速遍历,

    dispatch_apply(10, queue, ^(size_t index) {

    });

需要注意的是,这个方法的执行不像for循环那样按照顺序来的,他的顺序是随机的。

8.线程的挂起和继续

        NSLog(@"线程暂停");
        dispatch_suspend(queue);
        NSLog(@"线程继续");
        dispatch_resume(queue);

需要注意的是不要在主现场执行此操作,避免阻塞主线程。

9.dispatch_once

在apple的文档中,推荐的单例创建方法是使用此方法进行创建。该方法保证了在程序运行中只执行一次

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        ///需要执行的操作
    });

10.GCD中的大文件读写

dispatch_io_create

版权声明:本文为博主原创文章,未经博主允许不得转载。

GCD中一些API的使用

标签:queue   ios   并发   

原文地址:http://blog.csdn.net/zhwezhwe/article/details/46860489

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!