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. POJ3525:Most Distant Point from the Sea——题解

    http://poj.org/problem?id=3525 题目大意:给一个逆时针序列的多边形点集,求其中可以画的最大半径的圆的半径. —————————————————————— 二分枚举半径长度 ...

  2. BZOJ1854:[SCOI2010]连续攻击游戏——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1854 https://www.luogu.org/problemnew/show/P1640 lxh ...

  3. [bzoj 1594]猜数游戏

    主要是怎么处理矛盾 矛盾的条件有$2$种: 第一种是当把所有相等的$a$都全部找到后,他们并没有全联通,所以矛盾,因为没有两个是相同的 第二种是在2组$(l,r,a)$,$(l1,r1,a1)$中,$ ...

  4. 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基

    大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...

  5. Spring源码解析-autowiring自动装配的实现

    IoC容器提供了自动依赖装配的方式,为应用IoC容器提供很大的方便.在自动配置中,不需要显式的去指定Bean属性,只需要配置autowiring属性,IoC容器会根据这个属性配置,使用反射的方式查找属 ...

  6. HDU1083 :Courses(二分图匹配)

    Cources Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  7. POJ 2429 long long 质因数分解

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16206   Accepted: ...

  8. uboot两阶段代码分析

    1.启动过程特征总结(1)第一阶段为汇编阶段(start.s).第二阶段为C阶段(board.c中的start_armboot 函数)(2)第一阶段在SRAM中.第二阶段在DRAM中(3)第一阶段注重 ...

  9. Difference between Netbios and Host name

    Hostnames or NetBIOS names were used to provide a friendlier means of identifying servers or worksta ...

  10. HDU 5961 传递 BFS

    题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...