NSUserDefault 如何及时存储 (synchronize)

SUserDefault 的使用比较简单:

NSUserDefaults *mySettingData = [NSUserDefaults standardUserDefaults];

创建NSUserDefaults对象之后即可往里面添加数据,它支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放自定义的对象,则必须将其转换成NSData存储:

NSArray *arr = [[NSArray alloc] initWithObjects:@"arr1", @"arr2", nil]

[mySettingData setObject:arr forKey:@"arrItem"];

[mySettingData setObject:@"admin" forKey:@"user_name"];

@往NSUserDefaults添加数据后,它们就变成了全局的变量,App中即可读写NSUserDefault中的数据:

NSUserDefaults *mySetting = [NSUserDefaults standardUserDefaults];

NSLog(@"arrItem=%@", [mySetting objectForKey:@"arrItem"]);

NSLog(@"user_name=%@", [mySetting objectForKey:@"user_name"]);

@如果想删除某个数据项,可以使用removeObjectForKey删除数据:

[mySetting removeObjectForKey:@"arrItem"];

@需要注意的是,NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

[mySetting synchronize];

运行上面的语句后,NSUserDefaults中的数据立即被写入到.plist文件中,如果是在模拟器上运行程序,可以在Mac的/Library/Prefereces目录下面找到一个文件名为com.apple.PeoplePicker.plist的plist文件,用Xcode打开该文件,可以看到刚才写入的数据。

@pragma mark -引导页只执行一次

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstStart"]){

这一行-->加入引导页[self startYinDaoYe]

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstStart"];

[[NSUserDefaults standardUserDefaults] synchronize];

}

@系统定义的数据类型,NSUserDefault配合NSKeyedArchiver和NSKeyedUnarchiver做本地持久化

这里用数组做个举例:

static NSString  *const archiverKey = @"DataArray";

- (void)_testNSKeyedArchiverAndNSKeyedUnarchiver {

NSArray *setDataArray = @[@"1",@"2",@"3"];

NSData *archiverData = [NSKeyedArchiver archivedDataWithRootObject:setDataArray];

[[NSUserDefaults standardUserDefaults] setObject:archiverData forKey:archiverKey];

// 切莫忘记,依旧调用 synchronize 立即写入沙盒中

[[NSUserDefaults standardUserDefaults] synchronize];

NSArray *getDataArray = [NSArray new];

NSData *unarchiverData = [[NSUserDefaults standardUserDefaults] objectForKey:archiverKey];

getDataArray = [NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData];

NSLog(@" getDataArray = %@",getDataArray);

}

数组类型为NSArray的时候可以直接getDataArray = [NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]; 如果数组类型是NSMutableArray,则必须,getDataArray = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]]; 否则getDataArray为nil

@NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.

如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。

那怎么办呢?

让这个自定义类实现协议中的

- (id) initWithCoder: (NSCoder *)coder方法

- (void) encodeWithCoder: (NSCoder *)coder方法,

然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。或者使用归档来直接存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近公司项目中使用了本地存储,所以趁着周六日来整理一下在Swift中的几种数据存储方式。 一、plist文件存储 ...
    大脸猫121阅读 10,415评论 0 11
  • 一、四种本地化方式 1、XML属性列表(plist) 2、NSUserDefaults(Preference多是偏...
    小白进城阅读 3,587评论 0 3
  • 前言: 在程序开发中,数据层永远是程序的核心结构之一。对这些数据的加工处理是代码中能体现技术水平的一大模块,比如数...
    麦穗0615阅读 5,286评论 3 22
  • NSUserDefaults 使用 NSUserDefaults是什么,有什么用处 对于应用来说,每个用户都有自己...
    只是个少年阅读 2,087评论 0 0
  • NSUserDefaults是单例类。在整个程序中只有一个实例对象,可以用于数据的永久保存,顾大家喜欢用它保存简单...
    施主小欣阅读 3,975评论 0 9