IOS - 核心数据栈

标签 ios swift core-data error-handling syntax-error

我的问题如下:

  1. 在这种情况下,创建自定义枚举来处理核心数据错误是否是处理错误的最佳方式
  2. 如果持久存储容器未加载或我们无法保存上下文,则无需使用该应用程序,崩溃是最好的选择吗?
  3. 为了向用户显示这些错误消息,我是否必须调整 UIAlertAction?这也意味着我需要注册通知?
  4. 根据法律,我们必须获得发送通知的许可,最好是创建一个全新的通知文件并在该文件中添加错误枚举,还是让核心数据堆栈类符合通知协议(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/

相关文章:

iOS - NSPredicate 一对多核心数据

ios - 如何为不同状态的 UIButton 设置相同的标题颜色?

java - 如何将 iOS NSLocale localeIdentifier 转换为 Java Locale?

swift - 如何在tableView中调整单元格大小

Swift - 带有多个 UIPickers 的 View Controller .

json - 无法将类型 'Swift.Dictionary<Swift.String, protocol<>>' 的值转换为 'Swift.AnyObject'

iphone - 使 UIView 的特定角变圆

ios - 将 Objective-C 选择器映射到 Swift

ios - 如何以编程方式添加获取的属性(到数据模型)?

ios - Not Acceptable 属性值类型 - 所需类型 NSstring