6.9 Performing a Task Only Once with GCD


创建只执行一次的代码块

使用dispatch_once

上例子

@implementation AppDelegate

static dispatch_once_t onceToken;


void (^executedOnlyOnce)(void) = ^{

    static NSUInteger numberOfEntries = 0;

    numberOfEntries++;

    NSLog(@"Executed %lu time(s)", (unsigned long)numberOfEntries);

};


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    dispatch_queue_t concurrentQueue =

    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_once(&onceToken, ^{

        dispatch_async(concurrentQueue,

                       executedOnlyOnce);

    });

    

    dispatch_once(&onceToken, ^{

        dispatch_async(concurrentQueue,

                       executedOnlyOnce);

    });

    // Override point for customization after application launch.

    return YES;

}



结果他只执行了一次

2014-03-06 15:00:47.888 cookbook6_7[539:1403] Executed 1 time(s)


gcd在第一次执行时生成onceToken,往后发现onceToken已经有了就不在执行了。

看看dispatch_once_t是什么

/*!

 * @typedef dispatch_once_t

 *

 * @abstract

 * A predicate for use with dispatch_once(). It must be initialized to zero.

 * Note: static and global variables default to zero.

 */

typedef long dispatch_once_t;


所以以后单例模式可以这样来创建了

#import "MySingleton.h"

@implementation MySingleton

- (id) sharedInstance{
static MySingleton *SharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{

SharedInstance = [MySingleton new]; });

return SharedInstance; }

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值