我的问题如下:
- 在这种情况下,创建自定义枚举来处理核心数据错误是否是处理错误的最佳方式
- 如果持久存储容器未加载或我们无法保存上下文,则无需使用该应用程序,崩溃是最好的选择吗?
- 为了向用户显示这些错误消息,我是否必须调整 UIAlertAction?这也意味着我需要注册通知?
- 根据法律,我们必须获得发送通知的许可,最好是创建一个全新的通知文件并在该文件中添加错误枚举,还是让核心数据堆栈类符合通知协议(protocol)?
最终目标是通知用户持久存储不会加载或 moc 不会保存
提前感谢您抽出时间!
enum CoreDataError: Error {
// This is my custom Error handling enum
case persistenStore(description: String )
case saveChanges(description: String )
}
func coreDataErrors(throwError: Bool) throws -> CoreDataError {
// This is my Error Handling function
}
class CoreDataStack {
lazy var managedObjectContext: NSManagedObjectContext = {
let container = self.persistentContainer
return container.viewContext
}()
private lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "SafeHouseCDPhotoVault")
container.loadPersistentStores() { storeDescription, error in
if let error = error as NSError? {
fatalError("Unresolved error: \(error), \(error.userInfo)")
}
}
return container
}()
}
/* In almost every app tutorial available we learn to deal with errors using this fatal error logic to speed through the project
*/
extension NSManagedObjectContext {
func saveChanges() {
if self.hasChanges {
do {
try save()
} catch {
fatalError("Error: \(error.localizedDescription)")
}
}
}
}
// Again the demos have us deal with errors using fatal error
最佳答案
我通常将枚举用于错误情况,但我不会根据它们的来源来命名它们。根据您将如何将它们用于恢复或错误处理程序行为来命名它们。如果您不能处理它们,那么生成它们就没有多大意义。
那就到了第二个问题;如果您根本无法处理某个情况(例如启动时缺少 MOM),那么崩溃就是您所能做的。在那种情况下,我不喜欢警报。用户将如何处理这些信息?崩溃至少会发送给 Apple,您可以看到它并采取一些措施。
如果用户可以做某事,那么绝对提供错误。如果希望错误是暂时的(例如保存失败,这可能是由于磁盘已满),则可以向他们提供错误/重试。但在 iOS 上,这通常不值得麻烦和产生错误的风险。你打算如何测试你的错误/重试系统?如果你不能测试它,你怎么知道它比崩溃更好? (这不是一个无意义的问题;我曾经构建过一个崩溃捕获系统,该系统有一个错误,导致崩溃处理程序进入一个紧密循环并 swift 耗尽电池电量。这比崩溃更糟糕。)
如果您是初学者,那么您可能无法处理不常见的 Core Data 错误,您要做的最好和最安全的事情就是崩溃。处理好这些事情非常复杂且难以测试,我通常不建议在 iOS 上这样做(macOS 有点不同,因为写入错误通常是暂时的)。
关于IOS - 核心数据栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50892609/