GCD的简单用法

/*
     创建一个队列用来执行任务,TA属于系统预定义的并行队列即全局队列,目前系统预定义了四个不同运行优先级的全局队列,我们可以通过dispatch_get_global_queue来获取它们
     四种优先级
     DISPATCH_QUEUE_PRIORITY_HIGH
     DISPATCH_QUEUE_PRIORITY_DEFAULT
     DISPATCH_QUEUE_PRIORITY_LOW
     DISPATCH_QUEUE_PRIORITY_BACKGROUND

     不得已情况下可用dispatch_queue_create("newQueue", NULL); 创建,注意如果用此种方法创建需调用dispatch_release(queue)来释放此队列
     */
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //执行队列
    dispatch_async(queue, ^{
        //此队列执行的代码
    });
    //如果有多个队列执行,可以创建一个队列数组
    dispatch_group_t queueGroup = dispatch_group_create();
    //把一个个队列添加到数组中,先把任务添加到队列,然后再把队列和数组关联
    dispatch_group_async(queueGroup, queue, ^{
        //要执行的任务
    });

    /*
     dispatch_group_notify
        指定一个额外的程序块,该程序块将在组中的所有程序块即将运行完成时执行
     dispatch_get_main_queue()
        系统默认的一个串行队列与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行,main queue可以调用dispatch_get_main_queue()来获得,因为main queue是与主线程相关的
     */
    dispatch_group_notify(queueGroup, dispatch_get_main_queue(), ^{
        //执行代码
    });
    //获取执行的队列
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //执行完后执行此处代码
    });
    //dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
    dispatch_barrier_async(queue, ^{
        //执行代码
    });

    //dispatch_apply 执行某个代码片段N次
    dispatch_apply(5, queue, ^(size_t index) {
        // 执行5次
    });

    /*
     回归主线程
     __block 可以在block内部修改的变量,用此修饰符标识
     */
    __block NSString *updateStr = @"1";
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"回归主线程");
        updateStr = @"2";
    });

    //代替for循环 如果for循环中处理的任务是可并发的(并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行),显然放到一个线程中处理是很慢的,GCD提供两个函数dispatch_apply和dispatch_apply_f,dispatch_apply是用于Block的,而dispatch_apply_f可以用于c函数,它们可以替代可并发的for循环,来并行的运行而提高执行效率
    int count = 10;
    for (int i = 0; i < count; i++) {
        //do a lot of work here.
    }
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(count, queue, ^(size_t i) {
        //do a lot of work here.
    });

GCD的简单用法,布布扣,bubuko.com

时间: 2024-08-05 11:16:22

GCD的简单用法的相关文章

iOS多线程管理-Thread,NSOperation,GCD的简单用法

多线程 1.程序是一个可执行文件 2.进程是程序执行的一个操作实体 3.进程是线程的集合 4.多线程就是在一个程序(一个进程)中开启多条线路,为并发执行多个任务提供方便. 什么是线程? 1.进程当中并发执行的代码片段 2.线程是提高代码效率的一个手段 3.IOS中主要用于防止界面假死 4.线程是处理异步任务的主要手段 =============================== NSThread 1.+ (void)detachNewThreadSelector:(SEL)selector t

iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segmentfault.com/blog/alan/1190000002411296 iOS的各种动画相漂亮,相信这是吸引很多人买iPhone的原因之一.不仅如此,这还是吸引我做iOS开发的一大原因,因为在iOS上给界面实现一些像样的动画实在是太轻松了! 这里就介绍一下iOS的block-based an

Android WIFI 简单用法

随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

Android中资源文件中的字符串数组string-array简单用法

在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的strings.xml文件里,或是其他自定义的xml中都可以,以下操作方法相同. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球<

expect简单用法

1 #!/usr/expect/bin/expect -f 2 3 4 set loginuser [lrange $argv 0 0] 5 set loginpass [lrange $argv 1 1] 6 set ipaddr [lrange $argv 2 2] 7 set port [lrange $argv 3 3] 8 set timeout [lrange $argv 4 4] 9 set from [lrange $argv 5 5] 10 set to [lrange $ar

Tcpdump 的简单用法

Tcpdump 的简单用法 tcpdump是Linux命令行下使用最广泛的网络分析工具,运行的时候会将网卡运行在混杂模式下,需要root权限才能执行 下面是几个比较常见的参数: -w  保持到指定的文件 -i  指定监听的网卡,缺省显示第一块网卡 -nn 以IP方式显示host -v  显示详细信息 -s  指定数据包大小,缺省是65535 -t  不显示时间 ,缺省是显示时间戳 -c  获取数据包数量,缺省不限制,需要用Ctrl+c来终止 下面是关于命令关键字的说明 1.主要包括host,ne

C++ double转string类型以及MFC控件简单用法

这两天项目需要,测试c++库里面内容.生成jar再给Android调用.我没有学过C++,现在开始记录C++简单用法.测试时候一般都是使用mfc程序来测试,要输入值,显示结果吗.我用的编译环境vs2008. 一.double 转string #include <string> CString strResultx; strResultx.Format(_T("x:%.4f\n"), 89.7887878); 转换结果还是放在strResultx 2.两个字符串相连 CStr

vB SendMessage API 简单用法

vB SendMessage API 简单用法 1. 在Windows编程中,向文本框控件.列表控件.按钮控件等是我们最常接触的控件了.但是在VB中这些控件有时无法实现我们的需要.在这时,我们只要简单的利用Windows API函数就可以扩充这些控件的功能了.顾名思义,SendMessage函数就是向窗口(这里的窗口指的是向按钮.列表框.编辑框等具有hWnd属性的控件)发送消息的函数,该函数的定义如下:Declare Function SendMessage Lib "user32"

java中Object.equals()简单用法

/* equals()方法默认的比较两个对象的引用! */ class Child { int num; public Child(int x){ num = x; } //人文的抛出运行时异常的好处是:可以自定义错误信息! /*public boolean equals(Object o) throws ClassCastException{ if(!(o instanceof Child)) throw new ClassCastException("中文提示:类型错误"); Ch