【问题标题】:How to handle a CoreData crash in iOS Swift?如何在 iOS Swift 中处理 CoreData 崩溃?
【发布时间】:2018-05-11 06:40:02
【问题描述】:

我需要处理核心数据崩溃。我的代码在 managedObjectContext.save() 上崩溃了。 但是 catch 块没有捕获任何异常。为了避免崩溃,我怎样才能更好地编写我的 Catch 块这是我的代码。

do {
      try managedObjectContext.save()              
   } 
catch let error as NSError {
      Print.print("Error saving data store: \(error)")
     }

【问题讨论】:

  • 可能是内存问题。您节省了多少数据?
  • 什么是崩溃?在这里发帖...
  • 如何使用此代码预测崩溃。在此处添加崩溃日志
  • print("保存数据存储时出错:(error)") 你必须像这样使用打印语句。你能改变打印语句并再次运行它吗?
  • 0的CoreFoundation 0x191c76fe0 __exceptionPreprocess + 124(NSException.m:165)1 libobjc.A.dylib 0x1906d8538 objc_exception_throw + 56(objc-exception.mm:521)2 CoreData 0x19402d828 - [NSPersistentStoreCoordinator _coordinator_you_never_successfully_opened_the_database_disk_full:] + 56 (NSPersistentStoreCoordinator.m:2616) 3 CoreData 0x19402d930 -[NSPersistentStoreCoordinator _introspectLastErrorAndThrow] + 208 (NSPersistentStoreCoordinator.m:2646)

标签: ios iphone swift crash


【解决方案1】:

这是使用 CoreData 保存数据的示例。这可能会对您有所帮助。

 let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        if let entity = NSEntityDescription.entity(forEntityName: "Employees", in: context){
           let myItem = NSManagedObject(entity: entity, insertInto: context)
            myItem.setValue(nameTF.text, forKey: "names")
            myItem.setValue(15655, forKey: "mobileNo")

            do {
                try context.save()

            }catch let nserror as NSError{
                print("ERROR: Coredata error \(nserror)")
            }

        }

【讨论】:

  • 我的错误未在 catch 块中捕获。如何为异常编写多个捕获?
  • 在 catch 块中会出现错误,无需编写多个 catch 块。确保代码数据中出现错误。
【解决方案2】:

这看起来真的是你搞砸了上下文、持久存储和它的协调器的初始化。你最好调查一下。 SO 上已经有类似的帖子,例如this one

更重要的是,您不会在 Swift 中使用 try-catch 拦截此类异常。实际上,Swift try-catch 与异常没有任何关系,但它是一个高级 API,用于拦截报告的错误。在您的情况下,您只需拦截将数据保存到数据库时可能报告的错误。但这个错误似乎来自更深的地方。

更进一步,整个核心数据仍然完全在 ObjectiveC 中,它具有完全不同的抛出异常的系统,尽管这些异常可能会被 ObjectiveC try-catch 拦截,但来自 Swift 的异常不会被拦截。该系统所做的只是替换了将指向错误的指针输入到方法中:.save(&error),它在objectiveC中使用。只有当这个错误不为空时,你的 catch 块才会触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多