ios開發常用的五種數據存儲方式:
- plist
- NSUserDefaults
- NSKeyedArchiver
- FMDB
- CoreData
這篇文章我們主要回顧NSUserDefaults
的使用
NSUserDefaults
NSUserDefaults是一個單例,在整個程序中只有一個實例對象,它可以用于數據的永久存儲,主要面向的是一些簡單數據類型,如:NSNumber、NSString、NSArray、NSDictionary ...
1.值得注意的是對相同的key賦值約等于一次覆蓋
,所以請保證key的唯一性
以NSString為例:
存:
NSUserDefaults是定時把緩存中的數據寫入磁盤的,而不是即時寫入,為了防止在寫完NSUserDefaults后程序退出導致的數據丟失,可以在寫入數據后使用synchronize
強制立即將數據寫入磁盤.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *token = @"123456....";
[defaults setObject:password forKey:@"token"];
[defaults synchronize];
取:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *password = [defaults objectForKey:@"token"];
刪除:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"token"];
2.同時我們還要注意NSUserDefaults存儲的對象全是不可變的
,就算你存的時候是可變的,最后都會被轉成不可變的
以數組為例:
存:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *mutableArr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
NSArray *arr = [NSArray arrayWithArray:mutableArr];
[defaults setObject:arr forKey:@"mutableArr"];//這里最好存放不可變的(arr)
取 :(錯誤的寫法):
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *mutableArr = [defaults objectForKey:@"mutableArr"];
取:(正確的寫法):
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *mutableArr = [NSMutableArray arrayWithArray:[defaults objectForKey:@"mutableArr"]];
沒經過論證的觀點很容易扯到蛋!接著上面的存數據我們來證實一下"取數據"的結果:
//存
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *mutableArr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];
NSArray *arr = [NSArray arrayWithArray:mutableArr];
[defaults setObject:arr forKey:@"mutableArr"];//這里最好是不可變的,你存mutableArr(可變)也可
//取:錯誤的姿勢(不要直接賦值給可變數組(NSMutableArray))
NSMutableArray *getmutableArr = [defaults objectForKey:@"mutableArr"];
NSLog(@"%@",getmutableArr);
到這里我們運行一下程序:
2016-11-25 12:11:11.784 DataStorageDemo[18196:1134737] (
1,
2,
3
)
也沒什么bug啊,可是!可是!可是你向這個可變數組中加入數據試試:
[getmutableArr insertObject:@"4" atIndex:0];
NSLog(@"%@",getmutableArr);
程序崩潰了...了...了...
然后我們修改一下代碼:
//取:正確的姿勢-將取出的不可變數組賦值給可變數組
NSMutableArray *getmutableArr = [NSMutableArray arrayWithArray:[defaults objectForKey:@"mutableArr"]];
[getmutableArr insertObject:@"4" atIndex:0];
NSLog(@"%@",getmutableArr);
程序運行結果如下:
2016-11-25 12:31:51.670 DataStorageDemo[18283:1142923] (
4,
1,
2,
3
)
聰明如你,此刻該明白了!如果此時你想將修改后的數組存入NSUserDefaults,很簡單:
//還記得之前提到的相同的key約等于一次覆蓋嗎?
[defaults setObject:getmutableArr forKey:@"mutableArr" ];
3.NSUserDefaults應用場景
(1)好多app都帶有輪播圖功能
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
if (![[NSUserDefaults standardUserDefaults]boolForKey:@"FirstLogin"]) {
[[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"FirstLogin"];
SXGuideViewController *guideVC = [[SXGuideViewController alloc]init];
self.window.rootViewController = guideVC;
}else{
//版本更新
[self checkUpdate];
SXTabBarController *tabController = [[SXTabBarController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = tabController;
}
[self.window makeKeyAndVisible];
return YES;
}
在這里我們用NSUserDefaults存儲了一個BOOL值對象,如果是第一次進入app,取出的BOOL則為nil(因為之前沒存過),我們就進入加載輪播圖的VC(SXGuideViewController),并賦值BOOL為yes,存入沙盒.
等再次進入app時,因為我們之前為BOOL賦值YES,所以boolForKey:@"FirstLogin"就為不為空了,我們直接進入TabVC進行操作.
簡書中涉及到的技術點demo中都有,等更新完五種存儲之后,我會將代碼上傳到git供大家參考
(2) 自動登錄
登陸成功后我們可以存儲一個t字符串(判斷登陸是否有效的token,當然對安全沒多大需求的app甚至可以直接存儲部分用戶信息)
-(void)loginBtnAction
{
//實際開發中執行一些請求操作....
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"token字符串" forKey:@"token"];
}
之后再打開app時我們取出此token發送到服務端進行判斷當前登陸狀態是否有效