這是一個面向觀點問題。我能做的最好的事情就是讓你知道我過去如何設計我的應用程序來處理這種情況。
我的解決辦法:
使用NSFetchedResultsController
來讀取核心數據的數據,並使用NSFetchedResultsController的fetchedObjects
陣列作爲數據源到您的UITableViewController
或UICollectionViewController
實施的NSFetchedResultsController
代表這將Core數據中的數據更改時觸發。這樣你可以有效地更新你的CollectionView
和TableView
並在UI ASAP上顯示數據變化。
使用背景上下文來修改數據的方式你的主線程將是免費的應用保持響應。
爲了創建背景情況下,我更喜歡父子背景架構,而不是傳統的多語境架構。親子上下文架構很容易理解,保持代碼清潔。
切勿將圖像保存到核心數據中。而是將下載的圖像保存到文檔目錄,並將相關鏈接保存到CoreData中的下載文件中。
還記得我說過要刪除的文件不是絕對的文件相對路徑。因爲您的應用程序文件夾/沙箱路徑在殺死和重新啓動應用程序時發生變化。在覈心數據中保存文件的絕對路徑是徹底解決邏輯問題的好辦法。
不要擔心在數據保存到核心數據的延遲。延遲可能只有幾秒鐘,你甚至不會注意到。將數據保存在一個數組中,然後從核心數據中獲取數據並更新數組是一個完整的no。
就個人而言,使用陣列來保存數據,而不是NSFetchedResultsController的fetchedObjects是一個完整的NO。爲什麼?簡單來說,數組不是線程安全的,因爲您將後臺線程作爲Web服務調用和解析數據,您可能有多個線程同時訪問數組。由於Array不是線程安全的,因此您可能很容易進入數據不一致狀態,並且可能導致崩潰。
最後使用像SDWebImage這樣的庫來有效地加載圖像。 SDWebImage不僅可以加載圖像,還可以通過快速,快速地加載圖像,在各種級別(RAM和HardDisk中)緩存圖像。
如果你打算使用分頁來獲取數據,使用scrollViewDidScroll
滾動視圖的委託,當用戶滾動找出表/的CollectionView的底部,使Web服務調用,並獲取在後臺線程更新的核心數據。只要更新mainObjectContext,NSFetchedResults控制器的委託將被觸發,並且您應該能夠立即更新UI。
我喜歡先放映,然後保存。保存不是廉價的操作,應該在後臺隊列中執行,所以我們不能等到它完成。 – Akki
感謝您的意見Akki –