NSUserDefaults和dispatch_once的注意点

来源:互联网 发布:网络主播好听的歌曲 编辑:程序博客网 时间:2024/06/05 02:42
今天在实现一个需求时,遇到了一些问题,记录如下。需求是这样的,要让一段代码在整个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];
1 0
原创粉丝点击