2017-08-17 24 views
4

我的AppDelegate帶着以下所有熟悉的核心數據模板:如何處理NSPersistentContainer.loadPersistentStores中的錯誤?

lazy var persistentContainer: NSPersistentContainer = { 
    let container = NSPersistentContainer(name: "newsapp") 
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
     if let error = error as NSError? { 
      fatalError("Unresolved error \(error), \(error.userInfo)") 
     } 
    }) 
    return container 
}() 

它也有這樣的評論:

該應用程序的持續容器。此實現 創建並返回一個容器,該容器已將應用程序的商店加載到該容器中。此屬性是可選的,因爲有合法的 錯誤情況可能導致創建存儲失敗。

用代碼替換此實現以正確處理錯誤。 fatalError()導致應用程序生成崩潰日誌並終止。您不應該在運輸應用程序中使用此功能,儘管它在開發過程中可能很有用。這裏的錯誤

典型原因包括:

  • 父目錄不存在,無法創建,或不允許寫。
  • 由於設備鎖定時的權限或數據保護,永久存儲不可訪問。
  • 設備空間不足。
  • 商店無法遷移到當前的型號版本。

檢查錯誤消息以確定實際問題是什麼。

真,還是選擇了放棄在這個地方是一個壞主意,不僅它不是在生產中的應用程序允許的,但因爲as I read elsewhere,如果數據存儲被損壞因任何原因,用戶將不得不重新安裝應用程序不知道這一點。在這種情況下,用戶也可以刪除並忘記我的應用。

現在,人們應該怎麼處理這樣的錯誤呢?即使我編寫錯誤處理代碼,如果這些錯誤幾乎從不發生,我該如何測試才能正常工作?

我看了一遍,但找不到任何例子。

+0

我認爲你應該爲它創建一個提醒消息,就是這樣。 – Mannopson

回答

2

在大多數情況下,fatalError是唯一對此錯誤有意義的「處理」,儘管您可能想要顯示告警,告訴用戶發生了什麼事情。如果你需要持久存儲,但你無法加載它,那麼你有點兒搞砸了。

其中一些錯誤是在開發過程中應該出現的一些錯誤。與商店遷移或數據保護問題一樣,您需要對其進行測試,並在必要時修復應用,然後再發布。對於這樣的情況,fatalError實際上是有意義的,因爲只有你會經歷它。

在這些列出的示例中,唯一可能出現的可能難以測試的設備是空間不足。你可能檢查可用空間並提醒用戶。但是,除非您的應用程序使用了大量可以清除的空間,否則您仍然無法從錯誤中恢復。如果發生這種情況,iOS將會警告他們已經沒有空間了,所以不必自己做。

如果您沒有很多數據可以清除,fatalError在這裏仍然有用。

+0

設備空間不足時出現問題。我應該繼續爲這種情況使用'fatalError'? – Mannopson

+1

也許吧。與任何錯誤處理情況一樣,您需要回答這個問題,您的應用程序可能會做什麼來恢復?如果設備已滿,您的應用有什麼用處?如果是這樣,請嘗試做到這一點。如果沒有,那麼沒有其他的方式來回應。 –

+0

感謝您的評論!所以我還沒有任何恢復選擇。這個錯誤只會引發第一次對嗎? (當第一次啓動應用程序時)。如果我可以檢查'persistentContainer'的狀態會更好。如果成功創建,用戶必須能夠將數據添加到'persistentStore'。可以檢查這個狀態嗎?再次感謝 – Mannopson