NSUserDefaults和dispatch_once的注意点

今天在实现一个需求时,遇到了一些问题,记录如下。
需求是这样的,要让一段代码在整个APP的生命周期内(这里的整个APP的生命周期是指app安装到卸载的时间内,               
而不是程序的运行生命周期)只执行一次,我最先想到的是使用dispatch_once来实现,但很可惜,
dispatch_once内的代码是在程序的运行生命周期内执行一次。验证如下:
    static dispatch_once_t once;
    dispatch_once(&once , ^{
                UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
        view.backgroundColor = [UIColor redColor];
        [self.view addSubview:view];
    });
运行上述代码,会发现界面上会出现一个100x100的红方块,之后,同时按住shift+command键,然后双击H键,
在模拟器后台里关闭APP,之后,从模拟器里启动APP(千万不要点Xcode的run按钮),发现红方块依然被构建
了。因此,我得出结论dispatch_once内的代码是在程序的运行生命周期内执行一次。
既然dispatch_once不行,那只能NSUserDefaults上场了,我个人不太喜欢使用NSUserDefaults,所以我
一开始没打算用它。因为这东东和字典一个样,key值多的时候,鬼才记得哪个key存哪个value。解决这个问题
的一种方法是给NSUserDefaults专门写一个文档,另一种方法是新建一个用户信息单例类,然后对里面的属性
值进行归档(其实NSUserDefaults内部应该也是使用了这种机制),个人比较喜欢第二种方法,因为第二种的话
可以给类添加方法,对该类的信息的操作都可以在这个类中完成,这里先埋个坑,以后给大家介绍如何使用第二
种方法。
废话说了这么多,现在来列几个注意点。对NSUserDefaults的使用,这里不做说明。
的key,取出的值是null,如果是这样,那么取出的ss值,默认是NO:
//之前没有使用setValue:forKey方法赋值
BOOL ss = [[NSUserDefaults standardUserDefaults] objectForKey:@"once"];
这样写好处是不用到处找初始化的位置了,比如上面的需求,可以直接判断:
    if (![[NSUserDefaults standardUserDefaults] objectForKey:@"once"]) {
        /**
         *  做你想在整个APP生命里只做一次的事
         */
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"once"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
2:前往要记得,每次赋值后要调用“写方法(我是这么叫的)”,才能快速将内容写入文件,不然,没有这句
代码的话,写入操作会有延迟,具体看开发文档。
[[NSUserDefaults standardUserDefaults] synchronize];

你可能感兴趣的:(IOS)