iOS開發,你不得不知的資料存放區---乾貨,ios乾貨
1、喜好設定—多用於使用者名稱、是否自動登入等資料存放區
很多iOS應用都支援喜好設定,比如儲存使用者名稱、密碼、字型大小等設定,iOS提供了一套標準的解決方案來為應用加入喜好設定功能
每個應用都有個NSUserDefaults執行個體(有切僅有一個),通過它來存取喜好設定,比如,儲存使用者名稱、字型大小、是否自動登入
(1)儲存內容設定
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 將使用者名稱儲存2 [defaults setObject:@"JFCK" forKey:@"username"];
// 將字型尺寸儲存3 [defaults setFloat:18.0f forKey:@"text_size"];
(2)讀取上次儲存的設定
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];2 // 讀取username這個key的值3 NSString *username = [defaults stringForKey:@"username"];4 // 讀取text_size這個key的值
5 float textSize = [defaults floatForKey:@"text_size"];
6 // 讀取auto_login這個key的值
7 BOOL autoLogin = [defaults boolForKey:@"auto_login"];
(3)注意:UserDefaults設定資料時,不是立即寫入,而是根據時間戳記定時地把緩衝中的資料寫入本地磁碟。所以調用了set方法之後資料有可能還沒有寫入磁碟應用程式就終止了。出現以上問題,可以通過調用synchornize方法強制寫入
1 [defaults synchornize];
2、plist儲存—字典、數組儲存
(1) 資料儲存:
1】擷取Cache檔案路徑:
// 擷取Cache檔案路徑
// NSSearchPathDirectory:搜尋的目錄
// NSSearchPathDomainMask:搜尋範圍 NSUserDomainMask:表示在使用者的手機上尋找
// expandTilde 是否展開全路徑,如果沒有展開,應用的沙箱路徑就是~
// 儲存一定要要展開路徑
NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
2】拼接檔案名稱:
NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"];
3】將資訊寫入檔案:
// File:檔案的全路徑
[arr writeToFile:filePath atomically:YES];
樣本:
1 - (void)saver { 2 // 如何判斷一個對象能不能使用Plist,就看下有沒有writeToFile 3 NSArray *arr = @[@"123",@1]; 4 // 擷取Cache檔案路徑 5 // NSSearchPathDirectory:搜尋的目錄 6 // NSSearchPathDomainMask:搜尋範圍 NSUserDomainMask:表示在使用者的手機上尋找 7 // expandTilde 是否展開全路徑,如果沒有展開,應用的沙箱路徑就是~ 8 // 儲存一定要要展開路徑 9 NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];10 // 拼接檔案名稱11 NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"];12 // File:檔案的全路徑13 [arr writeToFile:filePath atomically:YES];14 }
資料讀取:
1 - (void)read {2 // 擷取Cache檔案路徑3 NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];4 // 拼接檔案名稱5 NSString *filePath = [cachePaht stringByAppendingPathComponent:@"arr.plist"];6 NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];7 NSLog(@"%@",arr);8 }
3、NSKeyedArchiver歸檔解檔(NSCoding)
如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢複;
不是所有的對象都可以直接用這種方法進行歸檔,只有遵守了NSCoding協議的對象才可以。
NSCoding協議有2個方法:
1、encodeWithCoder:
每次歸檔對象時,都會調用這個方法。一般在這個方法裡面指定如何歸檔對象中的每個執行個體變數,可以使用encodeObject:forKey:方法歸檔執行個體變數。
2、initWithCoder:
每次從檔案中恢複(解碼)對象時,都會調用這個方法。一般在這個方法裡面指定如何解碼檔案中的資料為對象的執行個體變數,可以使用decodeObject:forKey方法解碼執行個體變數。
完整執行個體:存取連絡人的名字、電話號碼資訊資料:
1、在資料模型的標頭檔中正常定義屬性和聲明類方法(執行個體化對象的方法)
1 #import <Foundation/Foundation.h> 2 3 @interface ICKContact : NSObject<NSCoding> 4 5 @property (nonatomic, strong) NSString *name; 6 7 @property (nonatomic, strong) NSString *phone; 8 9 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone;10 11 @end
2、在資料模型的實現檔案中,除了實現執行個體化對象的類方法以外,還需從新實現執行個體化對象的對象方法和儲存屬性的方法:
1 #import "ICKContact.h" 2 3 @implementation ICKContact 4 // 執行個體化資料模型方法 5 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone 6 { 7 ICKContact *contact = [[ICKContact alloc] init]; 8 contact.name = name; 9 contact.phone = phone;10 return contact;11 }12 // 遵守歸檔協議需調用的方法13 - (void)encodeWithCoder:(NSCoder *)aCoder14 {15 [aCoder encodeObject:self.name forKey:@"name"];16 [aCoder encodeObject:self.phone forKey:@"phone"];17 }18 19 // 遵守歸檔協議需調用的方法20 - (instancetype)initWithCoder:(NSCoder *)aDecoder21 {22 // super是否也實現(initWithCoder:aDecoder)方法,取決於父類super是否也遵守了NSCoding協議23 if (self = [super init]) {24 self.name = [aDecoder decodeObjectForKey:@"name"];25 self.phone = [aDecoder decodeObjectForKey:@"phone"];26 }27 return self;28 }29 30 @end
3、儲存資料:在需要儲存資料的檔案中實現
1 // 擷取全路徑2 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];3 NSString *path = [cache stringByAppendingString:@"contacts.data"];4 // 以數組形式寫入(底層中還是以一個一個對象的形式進行儲存)5 // self.contacts :資料模型數組(此處實現就省略了)6 [NSKeyedArchiver archiveRootObject:self.contacts toFile:path];
4、擷取資料:
1 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];2 NSString *path = [cache stringByAppendingString:@"contacts.data"];3 _contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];