資料儲存策略
在 iOS 應用程式中,從 “資料緩衝在哪裡” 這個緯度看,緩衝一般分兩種型別。
- 記憶體緩衝
- 磁碟緩衝
記憶體緩衝是將資料緩衝在記憶體中,供應用程式直接讀取和使用。優點是讀取速度快。缺點是由於記憶體資源有限,應用程式在系統中申請的記憶體,會隨著應用生命週期結束而被釋放,會導致記憶體中的資料丟失,因此將事件資料緩衝到記憶體中不是最佳選擇。
磁碟緩衝是將資料緩衝到磁碟空間中,其特點正好和磁碟緩衝相反。磁碟緩衝容量打,但是讀寫速度對於記憶體緩衝要慢點。不過磁碟緩衝可以持久化儲存,不受應用程式生命週期影響。因為,將資料儲存在磁碟中,丟失的風險比較低。即使磁碟緩衝資料速度較慢,但綜合考慮,磁碟緩衝是緩衝事件資料最優的選擇。
1.1 沙盒
iOS 系統為了保證系統的安全性,採用了沙盒機制(即每個應用程式都有自己的一個獨立儲存空間)。其原理就是通過重定向技術,把應用程式生成和修改的檔案重定向到自身的檔案中。因此,在 iOS 應用程式裡,磁碟快取的資料一般都儲存在沙盒中。
我們可以通過下面的方式獲取沙盒路徑:
// 獲取沙盒主目錄路徑
NSString *homeDir = NSHomeDirectory();
在模擬上,輸出沙盒路徑示例如下:
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/229B24A6-E13D-4DE6-9B52-363E832F9717
沙盒的根目錄下有三個常用的資料夾:
- Document
- Library
- tmp
(1)Document 資料夾
在 Document 資料夾中,儲存的一般是應用程式本身產生的資料。
獲取 Document 資料夾路徑的方法:
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask , YES).lastObject;
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/86212089-1D48-4B92-A919-AB87D3683191/Documents
(2) Library 資料夾
獲取 Library 資料夾路徑方法:
NSString *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask , NO).lastObject;
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/4BBA5D3E-0C75-4543-B831-AE3344DCC940/Library
在 Library 資料夾下有兩個常用的子資料夾:
- Caches
- Preferences
Caches 資料夾主要用來儲存應用程式執行時產生的需要持久化的資料,需要應用程式複製刪除。
獲取 Caches 資料夾路徑的方法
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask , YES).lastObject;
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/38CEA9CA-4C49-4B94-84F3-16E434ABFE0F/Library/Caches
Preferences 檔案儲存的是應用程式的偏好設定,即 iOS 系統設定應用會從該目錄中讀取偏好設定資訊,因此,該目錄一般不用於儲存應用程式產生的資料。
(3)tmp 資料夾
tmp 資料夾主要用於儲存應用程式執行時引數的臨時資料,使用後在將相應的檔案從該目錄中刪除,不會對 tmp 檔案中的資料進行備份。
獲取 tmp 檔案路徑的方法:
NSString *path = NSTemporaryDirectory();
/Users/renwei/Library/Developer/CoreSimulator/Devices/B1D7EC3E-BE72-4F8D-A4EF-E3D6316827CF/data/Containers/Data/Application/8E8906B8-0CBC-4A83-A220-A09F397304CD/tmp/
通過上面綜合對比發現,最適合快取事件資料的地方,就是 Library 下 Caches 資料夾中。
1.2 資料快取
在 iOS 應用程式中,一般通過兩種方式進行磁碟快取:
- 檔案快取
- 資料庫快取
這兩種方式都是可以實現資料採集 SDK 的緩衝機制。緩衝的策略即當事件發生後,先將事件資料儲存在快取中,待符合一定策略後從快取中讀取事件資料並進行同步,同步成功後,將已同步的事件從快取中刪除。
對於寫入的效能,SQLite 資料庫優於檔案快取.
對於讀取的效能:如果單條資料小於 100KB,則 SQLite 資料庫讀取的速度更快。如果單條資料大於 100KB,則從檔案中讀取的速度更快。
因此,資料採集 SDK 一般都是使用 SQLite 資料庫來快取資料,這樣可以擁有最佳的讀寫效能。如果希望採集更完整,更全面的資訊,比如採集使用者操作時當前截圖的資訊(一般超過100KB),檔案快取可能是最優的選擇。