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. HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)

    HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...

  2. python高效学习路线图

  3. 删除空格-sed

    如下,我需要提取出‘wan’这个字符串.可以发现在‘wan’的前后是有空格,需要将其删除. # lxc list # lxc list | grep lxdbr0 | awk -F "|&q ...

  4. ACE线程管理机制-并发控制(4)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/04/581857.html ACE Synchronization类 这一类并发控制对象一般也 ...

  5. C语言超大数据相加计算整理

    在做ACM 1002题时,整理得到. #include<stdio.h>#include<string.h>#define MAX 1000void zero(char *s, ...

  6. 你还在用notifyDataSetChanged?

    想到发这篇帖子是源于我的上一篇帖子#Testin杯#多线程断点续传后台下载 .帖子中讲述的项目使用了listView这个控件,而且自定义了adapter.在更新item的进度条时发现每次使用notif ...

  7. bug级别分类

    bug级别分类 2014-10-20 10:02 6403人阅读 评论(0) 收藏 举报  分类: SQA(17)  版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   由 ...

  8. 2015/8/28 Python基础(2):对象

    Python用对象模型来存储数据.构造任何类型的值都是一个对象.Python对象都有是三个特性:身份,类型和值 身份是每个对象的唯一身份标识.任何对象都可以用内建函数id()来得到身份.如: > ...

  9. mysql 多列唯一索引在事务中select for update是不是行锁?

    在表中有这么一索引 UNIQUE KEY `customer_id` (`customer_id`,`item_id`,`ref_id`) 问1. 这种多列唯一索引在事务中select for upd ...

  10. 01-QQ 3-最终重构版 Demo示例程序源代码

      源代码下载链接:01-QQ 3.zip292.5 KB // QQAppDelegate.h Map // //  QQAppDelegate.h //  01-QQ // //  Created ...