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


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

    全局只运行一次的代码,第一个想到的绝对是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

  • 相关阅读:
    Visual Studio for Application 内幕之二(转载)
    查找数组中极值
    .net中HashTable的最大容量
    返回数组中所有元素被第一个元素除的结果
    将json转换为DataTable
    ASP.NET面试题(推荐_有答案) FX
    [转]U盘启动制作工具|大白菜启动制作工具
    使用QFileDialog 同时选择 文件和文件夹
    [转]如何用SQL命令修改字段名称
    小朋友 老师 笑话
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3893721.html
Copyright © 2020-2023  润新知