zoukankan      html  css  js  c++  java
  • 设计根据标示符全局只运行一次的类

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

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

  • 相关阅读:
    转:页面Postback后定位滚动条不再难
    c:\windows\microsoft.net\framework\v1.1.4322\Config\machine.config 行: 198
    WebService相关概念和原理(中间层)
    JS 根据DropDownList的Text选中某一项
    javascript事件列表解说
    AJAXUpdateProgress设置CSS元素POSITION的使动画居中 & loading的Info
    ASP.NET2.0 Skin+CSS 测试
    C# 日期格式转换(转)
    编写代码创建DataTable对象
    ToString 格式化数值
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3893721.html
Copyright © 2011-2022 走看看