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. BZOJ1856:[SCOI2010]字符串——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1856 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还 ...

  2. bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)

    (其实今天好热啊? 题目大意:插入,删除,k小,前驱后继,数的排名. splay和treap裸题...过几天补个treap的 splay: #include<iostream> #incl ...

  3. [NOI2008] 道路设计

    link 思维题目,题目描述其实说的就是这是一个树,想到树形$dp$.若两个铁路不向交,则每个点的度都$\leq 2$.所以现在就可以搞dp了. 怎么去维护答案,容易想到设$dp(i,j,k)$为现在 ...

  4. 【BZOJ 3569】DZY Loves Chinese II 随机化+线性基

    用到一个结论——[先建树,再给每个非树边一个权值,每个树边的权值为覆盖他的非树边的权值的异或和,然后如果给出的边存在一个非空子集异或和为0则不连通,否则连通](必须保证每条边的出现和消失只能由自己产生 ...

  5. 直通BAT面试算法精讲课1

    1.有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树. 给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右 ...

  6. Codeforces Round #539 (Div. 2) 题解

    Codeforces Round #539 (Div. 2) 题目链接:https://codeforces.com/contest/1113 A. Sasha and His Trip 题意: n个 ...

  7. bzoj 2095 [Poi2010]Bridges 判断欧拉维护,最大流+二分

    [Poi2010]Bridges Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1448  Solved: 510[Submit][Status][D ...

  8. 基于Bootstrap的遮罩层,带有加载提示

    1.body中的html <div class="modal fade" id="loadingModal"> <div style=&quo ...

  9. JSP动态合并单元格

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <table ...

  10. 2015/8/26 Python基础(1):基本规则及赋值

    Python有如下的基本规则: #后表示注释 \n是行分隔符 \是继续上一行,将过长语句分开 :分号将两个语句连接在一行中 :冒号将代码头和体分开 代码块用缩进块的方式体现 不同缩进深度分隔不同的代码 ...