一  Dispatch_once函数简介
     使用dispatch_once提价的代码块,即便你提交多次,只能执行一次。
   void dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);

   第一个参数是一个传出参数用来保存代码块在队列运行时被赋的值,如果你想让自己的代码只执行一次的话,你必须指定一个同样的标识符,其实它是long类型的长整数,即typedef long dispatch_once_t。
    第二个参数是一个代码块,这个代码块没有参数和返回值。

    dispatch_once 中的代码块默认的情况下在当前的线程内中执行(也就是被调用函数所在的线程)

二 使用

- (void)viewDidLoad

{

   [super viewDidLoad]; 
   
    static dispatch_once_t onceToken;
    void (^executedOnlyOnce)(void) = ^(void)
    {
          static NSUInteger numberOfEntries = 0;
            numberOfEntries++;
            NSLog(@"Executed %lu time(s)   %@", (unsigned long)numberOfEntries,[NSThread currentThread]);
    };

dispatch_once(&onceToken, ^(void)
    {
        dispatch_async(concurrentQueue,executedOnlyOnce);
    });
    dispatch_once(&onceToken, ^(void)
    {
        dispatch_async(concurrentQueue,executedOnlyOnce);
    });

    
    
    static dispatch_once_t testToken;
    dispatch_once(&testToken, ^(void)
    {
        NSLog(@"####:Current thread = %@", [NSThread currentThread]);
    });

    
}    
 
输出结果:


2013-11-11 17:21:21.076 GCDDemo[1410:70b] ####:Current thread = <NSThread: 0x8a1e7c0>{name = (null), num = 1}
2013-11-11 17:21:21.076 GCDDemo[1410:2a03] Executed 1 time(s)   <NSThread: 0x8a794c0>{name = (null), num = 2}

观察发现:

1.使用了同一个dispatch_once_t标识提价的代码块只运行了一次。
2.使用dispatch_once提交的代码块默认情况下在当前线程内中执行(也就是被调用函数所在的线程),上面例子在主线程中提交的,所以打印的线程号为1.
3.为了在其他线程中运行dipsatch_once提交的代码块,可以将代码块的任务提交到GCD队列中。

三 单例模式

       可以利用dispatch_once的性质来实现单例模式,将我们自定义类的对象创建过程封装到一个代码块中,然后以dispath_once的方式来提交。

看代码:

    +(MyClass*)  sharedInstance
    {
        static  MyClass *_sharedMyClass;
        static dispatch_once_t token;
       
        dispatch_once(&token,^{ _sharedMyClass = [[MyClass alloc] initWith:something];} );
       
        return _sharedMyClass;
    }

注意:  1.使用dispatch_once是线程安全的。
             2.使用上面例子来实现的单例是“伪单例”,也就是说只有当使用者用MyClass *obj = [MyClass shardInstance];方式来取得对象时候才算是单例,但是我们无法阻止其直接只用alloc来创建自己的对象。

IOS GCD 使用(三)单例模式的更多相关文章

  1. 玩转iOS开发:iOS中的GCD开发(三)

    上一章, 我们了解到了GCD里的一些队列和任务的知识, 也实践了一下, 同时我们也对主队列的一些小情况了解了一下, 比如上一章讲到的卡线程的问题, 如果没有看的朋友可以去看看玩转iOS开发:iOS中的 ...

  2. iOS开发多线程篇—单例模式(ARC)

    iOS开发多线程篇—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 ...

  3. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  4. iOS GCD基础篇 - 同步、异步,并发、并行的理解

    1.关于GCD - GCD全称是Grand Central Dispatch  - GCD是苹果公司为多核的并行运算提出的解决方案  - GCD会自动利用更多的CPU内核(比如双核.四核)  - GC ...

  5. ios GCD的使用及封装

    实现代码: CGDHelper /* * Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. * 系统要求:iOS4.0以上. */ #import & ...

  6. XMPPFrameWork IOS 开发(三)登录

    原始地址:XMPPFrameWork IOS 开发(三) XMPP中常用对象们: XMPPStream:xmpp基础服务类 XMPPRoster:好友列表类 XMPPRosterCoreDataSto ...

  7. iOS GCD之dispatch_semaphore(信号量)

    前言 最近在看AFNetworking3.0源码时,注意到在 AFURLSessionManager.m 里面的 tasksForKeyPath: 方法 (L681),dispatch_semapho ...

  8. GCD学习 —— 三

    ​ 学习学习dispatch_block,在向队列中添加任务时,可以直接在对应的函数中添加 block.但是如果想对任务进行操作,比如监听任务.取消任务,就需要获取对应的 block. 1 创建Blo ...

  9. 【精】iOS GCD 具体解释

    一.介绍 1.什么是GCD? Grand Central Dispatch.是苹果公司开发的一套多核编程的底层API. GCD首次公布在Mac OS X 10.6,iOS4及以上也可用.GCD存在于l ...

随机推荐

  1. BZOJ 3953 Self-Assembly 解题报告

    首先,我们可以先考虑一个暴力一点的算法: 对于任意两个分子,如果它们能以至少一种进行匹配,那么我们就在这两个分子之间连一条边. 然后如果我们能找到一个环,就说明是 unbounded,否则就是 bou ...

  2. LFI & RFI & PHP封装协议之安全问题研究

    目录 . 文件包含的基本概念 . LFI(Local File Include) . RFI(Remote File Include) . PHP中的封装协议(伪协议).PHP的流式文件操作模式所带来 ...

  3. Unity C#写的A*寻路

    原地址:http://www.unity蛮牛.com/blog-13769-1078.html 首先看了这篇翻译外国人的文章http://www.raywenderlich.com/zh-hans/2 ...

  4. HDU4521+线段树+dp

    题意:在一个序列中找出最长的某个序列.找出的序列满足题中的条件. 关键:对于 第 i 个位置上的数,要知道与之相隔至少d的位置上的数的大小.可以利用线段树进行统计,查询.更新的时候利用dp的思想. / ...

  5. 如何在Blog中使用feedburner管理RSS订阅

    http://www.cnblogs.com/procoder/archive/2010/02/12/feedburner.html

  6. SQL server数据类型int、bigint、smallint、tinyint

    1. 整数类型 int.bigint.smallint.tinyint 数据类型 范围 存储 bigint -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9 ...

  7. spring cloud官方文档提到的服务开发的12项要素。

    I. Codebase 从一个代码库部署到多个环境. II. Dependencies 使用显式的声明隔离依赖,即模块单独运行,并可以显式管理依赖. III. Config 在系统外部存储配置信息. ...

  8. 判断微信内置浏览器的UserAgent

    要区分用户是通过"微信内置浏览器"还是"原生浏览器"打开的WebApp, 可以通过navigator.userAgent来进行判断. 以下是对各种平台上微信内置 ...

  9. Android 常用UI控件之TabHost(4)实现当Tab栏有多个tab时,可以左右滑动

    <!-- <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_wi ...

  10. apache开源项目--Cassandra

    Apache Cassandra是一套开源分布式Key-Value存储系统.它最初由Facebook开发,用于储存特别大的数据.Facebook目前在使用此系统. 主要特性: 分布式 基于column ...