https://github.com/xufeng79x/GCDDemo

1.简介

在前面的两篇博文中我介绍了GCD的一般使用方法和死锁的分析调查。本博文中继续讲解GCD的其他比较常用的几个使用方法。

2.线程间的通信

线程间通信意指如何在当前线程中去通知或者去调度其他线程完成任务。

比较经典的一个用例为将耗时操作放在某个线程中(非主队列任务)然后完成后去更新控件(主队列任务)。

-(void)loadImage
{
    dispatch_async(dispatch_get_global_queue(, ), ^{
        // 1. 网络上图片的URL
        NSURL *url = [NSURL URLWithString:@"http://att2.citysbs.com/hangzhou/image1/2010/06/28-14/middle_20100628_479774d896cf207fed251P3nfB3V8Pmp.jpg"];

        // 2. 获取网络图片数据,二进制
        NSData *data = [NSData dataWithContentsOfURL:url];

        // 3. 二进制数据转换成图片
        UIImage *image = [UIImage imageWithData:data];

        // 4.通知主线程更新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            self.image.image = image;
        });

    });

}

如果你自己测试代码测试那么需要在工程的info.plist中进行如下设定,增加如下选项:

3.延迟执行

-(void) delayExecute
{
    // 延迟时间
    dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC));
    NSLog(@"start at %@", [NSDate new]);

    // 指定队列,延迟指定时间后执行任务
    dispatch_after(when, dispatch_get_global_queue(, ), ^{
        NSLog(@"end at %@", [NSDate new]);
        NSLog(@"%@", [NSThread currentThread]);
    });
}

结果:

-- :::] start at -- :: +
-- :::] end at -- :: +
-- :::] <NSThread: , name = (null)}

4.调度组

调度组的应用场景:

开发的时候有的时候出现多个网络请求,在多个网络请求全部结束后统一去触发某个处理(更新UI通知用户等)。

比如下载多部小说后通知用户小说已经全部下载完毕了。

基本步骤如下:

-(void) group
{
    // 实例化一个调度组
    dispatch_group_t group = dispatch_group_create();

    // 创建或者获取队列
    dispatch_queue_t queue1 = dispatch_get_global_queue(, );

    // 将任务放入队列,包进到指定group
    dispatch_group_async(group, queue1, ^{
        NSLog(@"下载小说A----%@", [NSThread currentThread]);
    });

    // 创建或者获取队列
    dispatch_queue_t queue2 = dispatch_queue_create("xf", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_async(group, queue2, ^{
        NSLog(@"下载小说B----%@", [NSThread currentThread]);
    });

    // 创建或者获取队列
    dispatch_queue_t queue3 = dispatch_queue_create("xf", DISPATCH_QUEUE_SERIAL);
    dispatch_group_async(group, queue3, ^{
        NSLog(@"下载小说C----%@", [NSThread currentThread]);
    });

    // 创建或者获取队列
    dispatch_queue_t queue4 = dispatch_get_main_queue();
    dispatch_group_notify(group, queue4, ^{
        NSLog(@"下载完成,请观看----%@", [NSThread currentThread]);
    });
}

结果:

-- :::] 下载小说B----<NSThread: , name = (null)}
-- :::] 下载小说A----<NSThread: , name = (null)}
-- :::] 下载小说C----<NSThread: , name = (null)}
-- :::] 下载完成,请观看----<NSThread: , name = main}

总结:

可以看到,放入group的任务可以在不同的队列中,group能够统一的感知到所有任务是否全部完成。

5.一次性执行

-(void)once
{
    static dispatch_once_t onceToken;
    NSLog(@"out onceToken is %ld", onceToken);
    dispatch_once(&onceToken, ^{
        NSLog(@"in onceToken is %ld", onceToken);
        NSLog(@"执行了一次!");
    });

    NSLog(@"完成");
}

结果:

-- :::]
-- :::]
-- :::] 执行了一次!
-- :::] 完成
-- :::]
-- :::] 完成
-- :::]
-- :::] 完成

总结:

即使我们多次点击屏幕,“执行一次!”这段log也只会出书一次,换句话说,任务只被执行一次。

其实这段代码是通过onceToken这个静态数据来判断任务是否已经被执行了,当判断为-1时候认为任务已经被执行了。

如果我们一开始就初始化onceToken为-1,其实程序就一次也不会做任务了。不信试一试。

场景:

我们可以将这个特性应用于单例的创建。

[New learn]GCD其他方法的使用的更多相关文章

  1. [New learn]GCD的卡死现象分析研究

    https://github.com/xufeng79x/GCDDemo 1.简介 前接[New learn]GCD的基本使用,我们分析了GCD的一般使用方法,其中比较特殊的是在分析到主队列的时候发生 ...

  2. [New learn]GCD的基本使用

    https://github.com/xufeng79x/GCDDemo 1.简介 介绍GCD的使用,介绍多种队列与同步异步多种情况下的组合运行情况. 2.基本使用步骤 如果使用GCD则一般也就两个步 ...

  3. iOS 线程之GCD的高级使用方法

    之前的一篇关于线程的blog已经为大家介绍了GCD的简单使用方式及样例说明,今天因为项目中有特殊的应用GCD的实例,为大家介绍两种特殊需求的使用GCD的方法. 目的:实现一件事情做完,再做下一件事情. ...

  4. GCD中的dispatch_group函数的详解

    <一>引入dispatch_group函数的目的 在追加到dispatch_Queue中的多个处理全部结束后想要执行结束的处理,这种需求经常会在我们的程序中出现 (第一种情况)只使用一个S ...

  5. Operation与GCD的不同

    最大并发数: 什么是并发数? 同时执行的任务数.比如同时开启三个线程执行三个任务,并发数就是3. 最大并发数相关的方法: -(NSInteger)maxConcurrentOperationCount ...

  6. iOS开发中GCD在多线程方面的理解

    GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...

  7. 【转】MegaSAS RAID卡 BBU Learn Cycle周期的影响

    http://ju.outofmemory.cn/entry/140 背景 最近遇到有些带MegaSAS RAID卡的服务器,在业务高峰时突然IO负载飚升得很高,IO性能急剧下降,查了日志及各种设置最 ...

  8. 选择 GCD 还是 NSTimer ?

    我们常常会延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. 延迟操作的方案一般有三种: 1.NSObject的方法: 2.使用NSTimer的方法: 3 ...

  9. iOS多线程开发--NSThread NSOperation GCD

    多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...

随机推荐

  1. (转)把hadoop源码关联到eclipse工程

    把hadoop源码关联到eclipse工程     转:http://www.superwu.cn/2013/08/04/355 在eclipse中阅读源码非常方便,利于我们平时的学习,下面讲述如何把 ...

  2. Tomcat启动时报org.springframework.web.context.ContextLoaderListener错误解决方案

    问题现象:新从svn上检出maven的项目maven+spring+springmvc项目在Tomcat启动时,报如下错误. 严重: Error configuring application lis ...

  3. eclipse ide for java ee developers 开发环境搭建(J2EE) 【转载】

    使用eclipse真的有年头了,相信java程序员没有不知道它的,最近在给团队中新来的应届生做指导,专门讲解了一下Eclipse开发环境的搭建过程, 一是帮助他们尽快的熟悉IDE的使用,二也是保证团队 ...

  4. 如何用好 github 中的 watch、star、fork

    http://www.jianshu.com/p/6c366b53ea41 https://www.zhihu.com/question/20431718 在每个 github 项目的右上角,都有三个 ...

  5. HDU 5651 逆元

    xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  6. Codeforces Round #340 (Div. 2) A

    A. Elephant time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  7. bzoj 1111 [POI2007]四进制的天平Wag 数位Dp

    1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 302  Solved: 201[Submit][St ...

  8. HDU 3507斜率优化dp

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  9. 杭电多校第八场-A-Character Encoding

    题目描述 In computer science, a character is a letter, a digit, a punctuation mark or some other similar ...

  10. BZOJ2733:使用并查集维护连通性之后用线段树维护+线段树合并(动态开点)

    可以说是线段树合并的裸题吧 题意就是给你两个操作 一个操作是合并两个集合,这两个集合都是用权值线段树维护的,便于查询第k小元素 另一个操作就是查询区间极值了 #include<cstdio> ...