设计根据标示符全局只运行一次的类

简介:

设计根据标示符全局只运行一次的类

全局只运行一次的代码,第一个想到的绝对是dispatch_once,这是不二的选择嘛,dispatch_once还是线程安全的.

这里我将提供一种非线程安全但也可以使用的全局只运行一次的代码,设计很简单:

现在提供类如下:

StaticFlag.h   +   StaticFlag.m

//
//  StaticFlag.h
//  Static
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef void (^StaticFlagBlock)();

@interface StaticFlag : NSObject

+ (void)flag:(NSString *)flag
       class:(Class)objectClass
   firstTime:(StaticFlagBlock)firstTime
  otherTimes:(StaticFlagBlock)otherTimes;

@end


//
//  StaticFlag.m
//  Static
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "StaticFlag.h"

static NSMutableDictionary *flagDictionary  = nil;

@implementation StaticFlag

+ (void)initialize
{
    if (self == [StaticFlag class])
    {
        flagDictionary = [NSMutableDictionary new];
    }
}

+ (void)flag:(NSString *)flag
       class:(Class)objectClass
   firstTime:(StaticFlagBlock)firstTime
  otherTimes:(StaticFlagBlock)otherTimes
{
    NSString *str = [NSStringFromClass(objectClass) stringByAppendingString:flag];
    NSLog(@"%@", str);
    
    if ([flagDictionary valueForKey:str] == nil)
    {
        [flagDictionary setObject:@"HAVE" forKey:str];
        firstTime();
    }
    else
    {
        otherTimes();
    }
}

@end

使用情况:
//
//  AppDelegate.m
//  OnlyOne
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "AppDelegate.h"
#import "StaticFlag.h"

#define FLAG  @"YouXianMing"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [StaticFlag flag:FLAG
               class:[AppDelegate class]
           firstTime:^{
               NSLog(@"第一次");
           }
          otherTimes:^{
              NSLog(@"第二次");
          }];
    
    
    [StaticFlag flag:FLAG
               class:[AppDelegate class]
           firstTime:^{
               NSLog(@"第一次");
           }
          otherTimes:^{
              NSLog(@"第二次");
          }];
    
    
    return YES;
}

@end

目录
相关文章
|
5月前
|
编译器 C# 开发者
C# 10.0中的全局`using`指令:简化命名空间引用的新方式
【1月更文挑战第4天】本文介绍了C# 10.0中引入的全局`using`指令,该指令允许开发者在项目级别统一管理命名空间引用,从而消除源文件中重复的`using`语句。全局`using`指令通过减少冗余代码、提高可维护性和统一命名空间管理,为开发者带来了更高效的编码体验。文章详细解释了如何实现全局`using`指令,并探讨了其在实际项目中的优势和适用场景。
|
11月前
|
程序员 C语言 C++
06 C++ - 名字控制
06 C++ - 名字控制
54 0
|
安全
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
166 0
|
Java 数据挖掘 索引
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(一)
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(一)
156 0
【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )(一)
|
JavaScript 前端开发
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
207 0
|
C#
C#资源文件与与资源名称字符串之间的互相转化
原文:C#资源文件与与资源名称字符串之间的互相转化 1.使用ResourceManager string st = Properties.Resources.ResourceManager.GetString(tableName);value = Properties.
1092 0