• iOS只执行一次的方法


    IOS开发(64)之GCD任务最多只执行一次

    1 前言

    使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始化)。

     

    2 代码实例
    ZYAppDelegate.m

     

    [plain]
    /一个用于调度一次函数的标识
    static dispatch_once_t onceToken;
    //Block Object
    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);
        });
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        // Override point for customization after application launch.
        self.viewController = [[[ZYViewController alloc] initWithNibName:@"ZYViewController" bundle:nil] autorelease];
        self.window.rootViewController = self.viewController;
        [self.window makeKeyAndVisible];
        return YES;
    }

    //一个用于调度一次函数的标识
    static dispatch_once_t onceToken;
    //Block Object
    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);
        });
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        // Override point for customization after application launch.
        self.viewController = [[[ZYViewController alloc] initWithNibName:@"ZYViewController" bundle:nil] autorelease];
        self.window.rootViewController = self.viewController;
        [self.window makeKeyAndVisible];
        return YES;
    }
    ZYViewController.m

     

    [plain]
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        ZYMySingleton *test = [[ZYMySingleton alloc] init];
        //循环单例方法
        for (int i=0; i<5; i++) {
            [test sharedInstance];
        }
        [test release];
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        ZYMySingleton *test = [[ZYMySingleton alloc] init];
        //循环单例方法
        for (int i=0; i<5; i++) {
            [test sharedInstance];
        }
        [test release];
    }
    ZYMySingleton.m

     

    [plain] view plaincopyprint?- (id) sharedInstance{
        static ZYMySingleton *SharedInstance = nil;
        //一个用于调度一次函数的标识
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            SharedInstance = [ZYMySingleton new];
            NSLog(@"SharedInstance is ======>%@",SharedInstance);
        });
        return SharedInstance;
    }

    - (id) sharedInstance{
        static ZYMySingleton *SharedInstance = nil;
        //一个用于调度一次函数的标识
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            SharedInstance = [ZYMySingleton new];
            NSLog(@"SharedInstance is ======>%@",SharedInstance);
        });
        return SharedInstance;
    }
    运行后控制台显示结果

  • 相关阅读:
    linux shell 中"2>&1"含义-完美理解-费元星
    浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID -费元星
    费元星-关于百度在数据仓库-层级架构上的思考
    费元星的第二代车,基于图像识别和超声波的无人智能小车
    【完美解决】Spark-SQL、Hive多 Metastore、多后端、多库
    【费元星】crt 无法上传文件,总是显示盾牌表示-完美解决
    【费元星原创】一键安装Hadoo2.7.6 集群完全分布式脚本-完美解决
    【研发工具必备】费元星的技术成长流线图-第一版
    【shell mysql 导出数据到csv脚本,完美解决乱码转义符等问题】-费元星
    【Linux搭建创建FTP服务器】---完美解决
  • 原文地址:https://www.cnblogs.com/lidongxiao/p/4956631.html
Copyright © 2020-2023  润新知