6.9 Performing a Task Only Once with GCD

本文介绍如何使用dispatch_once确保代码块仅执行一次,并通过实例展示了如何在应用启动时执行该代码块,同时提供了dispatch_once_t类型的解释,以及如何在单例模式中应用这一特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


创建只执行一次的代码块

使用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值