iOS 資料儲存

2022-07-18 12:03:34

資料儲存策略

​ 在 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),檔案快取可能是最優的選擇。