文章目錄
- 資料持久化
- 資料持有化方式分類
- 記憶體快取
- 磁盤快取
- 沙盒
- 持久化方式
資料持久化
iOS中的永久存盤,也就是在關機重新啟動設備,或關閉應用時不會丟失資料,在實際開發中,往往需要持有存盤資料的,
資料持有化的目的
- 快速展示,提升體驗
-
- 已經加載過的資料,用戶下次查看的時候,不需要再次從網路(磁盤)加載,直接展示給用戶
- 節省用戶流量(節省服務器資源)
-
- 對于較大的資源資料進行快取,下次展示無需下載消耗流量
-
- 同時降低了服務器的訪問次數,節約服務器資源
- 離線使用
- 記錄用戶操作
資料持有化方式分類
在移動端的資料持有化方式總體有兩類
記憶體快取
- 定義: 對于使用頻率比較高的資料,從網路或磁盤加載資料到記憶體以后,使用后并不馬上銷毀,下次使用直接從記憶體加載,
記憶體指當前程式的運行空間,快取速度快容量小,是臨時存盤檔案用的,供CPU直接讀寫,打開一個程式,他是在記憶體中存盤,關閉程式后記憶體就又回到原來的空間空間, - 案例
-
- iOS系統圖片加載——[UIImage imageNamed:@“imageName”]
-
- 網路圖片加載三方庫 SDWebImage
磁盤快取
- 定義:將從網路加載的,用戶操作產生的資料寫入到磁盤,用戶下次查看、繼續操作時,直接從磁盤加載使用
磁盤是程式的存盤空間,快取容量大、速度慢、可持有化,與記憶體不同的是磁盤是永久存盤東西的, - 案例
用戶輸入內容草稿快取
搜索歷史快取
網路圖片加載三方庫 SDWebImage
沙盒
iOS每個應用程式在安裝時,會創建屬于自己的沙盒檔案(存盤空間),應用程式只能訪問自身的沙盒檔案,不能訪問其他應用程式的沙盒檔案,所有非代碼檔案都要保存在此,例如屬性檔案plist、文本檔案、影像、圖示、媒體資源等,其原理是通過重定向技術,把程式生成和修改的檔案定向到自身檔案夾中,
每個app的沙盒下面都有相似目錄結構

獲取應用程式沙盒路徑
NSString *path = NSHomeDirectory();
模擬機沙盒路徑

注意:每次編譯代碼會生成新的沙盒路徑,注意是編譯不是啟動,所以模擬機或者真機運行,每次運行所得到的沙盒路徑都是不一樣的,線上版本app真機不會生成新的沙盒路徑
上面的路徑就是當前應用程式目錄的路徑,該目錄下就是應用程式的沙盒,在該目錄下有四個檔案夾:Documents、Library、SystemData、tmp,當前應用程式只能訪問該目錄下的檔案,
訪問沙盒目錄常用的方法
FOUNDATION_EXPORT NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
該方法回傳一個陣列,在iphone中由于只有一個唯一路徑,元素只有一個,所以直接取陣列第一個元素即可
- 引數1 directory:指定搜索的目錄名稱,比如使用NSDocumentDirectory表明我們要搜索的時Document目錄,如果換成NSCachesDirectory就表明我們搜索的是Library/Caches目錄
NSSearchPathDirectory列舉值部分如下

- 引數2 domainMask:NSSearchPathDomainMask型別,搜索主目錄的位置,NSUserDomainMask表示搜索的范圍限制于當前應用沙盒目錄,NSLocalDomainMask(表示/Library)

- 引數3 expandTilde:是否獲取完整路徑,在iOS中全寫形式是/User/userName,該值為yes表示全寫形式,為no就直接寫成~

現在分別介紹沙盒下的目錄

- Documents
保存持有化資料,會備份,一般用來存盤需要持有化的資料
一般在專案中,我們會把一些用戶的登錄資訊以及搜索歷史等關鍵資料存盤到這里,
不能存放快取檔案,否則上架不被通過
此檔案夾是默認備份的,備份到iCloud
NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; - Library
獲取Library路徑
NSString *libStr = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];

-
- Caches
存放體積大又不需要備份的資料
快取資料應該保存在/Library/Caches目錄下
快取資料在設備低存盤空間時可能會被洗掉,iTunes或iCloud不會對其進行備份,
- Caches
-
- Perferences
保存應用的所有偏好設定,iCloud會備份設定資訊,需要通過NSUserDefault這個類來訪問應用程式的偏好設定

- Perferences
- tmp
臨時檔案夾,臨時資料保存在這里,不會被備份,保存應用運行時所需的臨時資料,系統會自動清理,

持久化方式
- NSUserDefaults
簡單資料快速讀寫,不能存盤自定義型別
UserDefaults設定資料時,不是立即寫入,而是根據時間戳定時地把快取中的資料寫入本地磁盤,所以呼叫了set方法之后資料有可能還沒有寫入磁盤應用程式就終止了,出現以上問題,可以通過呼叫synchornize方法[defaults synchornize];強制寫入,
偏好設定存盤的優點:
不需要關心檔案名,系統會自動幫你生成一個檔案名
快速做鍵值對的存盤

- Property list (屬性串列)檔案存盤
屬性串列是一種XML格式的檔案,拓展名為plist如果對是NSString、NSDictionary、NSArray、NSData、NSNumber等型別,就可以使用writeToFile:atomically:方法直接將物件寫到屬性串列檔案中,


- 物件的歸檔、解檔
NSKeyedArchiver如果物件是NSString、NSDictionary、NSArray、NSData、NSNumber等型別,可以直接用NSKeyedArchiver進行歸檔和恢復,

不是所有的物件都可以直接用這種方法進行歸檔,只有遵守了NSCoding協議的物件才可以,NSSecureCoding也遵循了原來NSCoding這個協議,我們還需要遵實作NSSecureCoding的supportsSecureCoding方法 -
- NSCoding協議的2個方法
encodeWithCoder:每次歸檔物件時,都會呼叫這個方法,一般在這個方法里面指定如何歸檔物件中的每個實體變數,可以使用encodeObject:forKey:方法歸檔實體變數
initWithCoder:每次從檔案中恢復(解碼)物件時,都會呼叫這個方法,一般在這個方法里面指定如何解碼檔案中的資料為物件的實體變數,可以使用decodeObject:forKey方法解碼實體變數,
- NSCoding協議的2個方法
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject <NSSecureCoding>
@property (nonatomic, copy) NSString *str;
@property (nonatomic, copy) NSString *name;
@end
#import "Person.h"
@implementation Person
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.name forKey:@"name"];
[coder encodeObject:self.str forKey:@"str"];
}
- (instancetype)initWithCoder:(NSCoder *)coder {
self.name = [coder decodeObjectForKey:@"name"];
self.str = [coder decodeObjectForKey:@"str"];
return self;
}
+ (BOOL)supportsSecureCoding {
return YES;
}
@end

在對集合進行完全深復制時,也可以使用歸檔解檔的方法

- 資料庫存盤
-
- SQLite
是目前主流的嵌入式關系型資料庫,其最主要的特點就是輕量級、跨平臺,當前很多嵌入式作業系統都將其作為資料庫首選,
- SQLite
-
- CoreData
CoreData是iOS5之后才出現的一個框架,本質上是對SQLite的一個封裝,它提供了物件-關系映射(ORM)的功能,即能夠將OC物件轉化成資料,保存在SQLite資料庫檔案中,也能夠將保存在資料庫中的資料還原成OC物件,在這個程序中不需要手動撰寫任何SQL陳述句,CoreData封裝了資料庫的操作程序,以及資料庫中資料和OC物件的轉換程序,通過CoreData管理應用程式的資料模型,可以極大程度減少需要撰寫的代碼數量
- CoreData
-
- FMDB
是一個處理資料存盤的第三方框架,框架是對sqlite的封裝,整個框架非常輕量級但又不失靈活性,而且更加面向物件,
- FMDB
什么是序列化和反序列化,用來做什么
- 序列化:把物件轉化為位元組序列的程序
- 反序列:化把位元組序列恢復成物件
- 作用:把物件寫到檔案或者資料庫中,并且讀取出來
參考
參考
參考
參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292762.html
標籤:其他
