iOS資料庫離線快取思路和網路層封裝

發表於2015-11-28

一直想總結一下關於iOS的離線資料快取的方面的問題,然後最近也簡單的對AFN進行了再次封裝,所有想把這兩個結合起來寫一下。資料展示型的頁面做離線快取可以有更好的使用者體驗,使用者在離線環境下仍然可以獲取一些資料,這裡的資料快取首選肯定是SQLite,輕量級,對資料的儲存讀取相對於其他幾種方式有優勢,這裡對AFN的封裝沒有涉及太多業務邏輯層面的需求,主要還是對一些方法再次封裝方便使用,解除專案對第三方的耦合性,能夠簡單的快速的更換底層使用的網路請求程式碼。這篇主要寫離線快取思路,對AFN的封裝只做簡單的介紹。

關於XLNetworkApi

XLNetworkApi的一些功能和說明:

  • 使用XLNetworkRequest做一些GET、POST、PUT、DELETE請求,與業務邏輯對接部分直接以陣列或者字典的形式返回。
  • 以及網路下載、上傳檔案,以block的形式返回實時的下載、上傳進度,上傳檔案引數通過模型XLFileConfig去存取。
  • 通過繼承於XLDataService來將一些資料處理,模型轉化封裝起來,於業務邏輯對接返回的是對應的模型,減少Controllor處理資料處理邏輯的壓力。
  • 自定義一些回撥的block
  • XLNetworkRequest.m部分實現
  • 下載部分程式碼
  • 上傳部分程式碼
  • XLDataService.m部分實現
  • (關鍵)下面這個方法提供給繼承XLDataService的子類重寫,將轉化為模型的程式碼寫在這裡,相似業務的網路資料請求都可以用這個子類去請求資料,直接返回對應的模型陣列。
    關於離線資料快取

    當使用者進入程式的展示頁面,有三個情況下可能涉及到資料庫存取操作,簡單畫了個圖來理解,思路比較簡單,主要是一些存取的細節處理。

  • 進入展示頁面
    進入頁面.png
  • 下拉重新整理最新資料
    下拉重新整理.png
  • 上拉載入更多資料
    上拉載入更多.png
  • 需要注意的是,上拉載入更多的時候,每次從資料庫返回一定數量的資料,而不是一次性將資料全部載入,否則會有記憶體問題,直到資料庫中沒有更多資料時再發生網路請求,再次將新資料存入資料庫。這裡儲存資料的方式是將伺服器返回每組資料的字典歸檔成二進位制作為資料庫欄位直接儲存,這樣儲存在模型屬性比較多的情況下更有優勢,避免每一個屬性作為一個欄位,另外增加了一個idStr欄位用來判斷資料的唯一性,避免重複儲存。
    首先定義一個工具類XLDataBase來做資料庫相關的操作,這裡用的是第三方的FMDB。

  • 一些繼承於XLDataService的子類的資料庫儲存和模型轉換的邏輯程式碼

  • 下面是一些控制器的程式碼實現:

最後附上程式碼的下載地址,重要的部分程式碼中都有相應的註釋和文字列印,執行程式可以很直觀的表現。

https://github.com/ShelinShelin/OffLineCache.git
有考慮不周的地方,希望大家能提出一些意見,很樂意與大家互相交流。

相關文章