【发布时间】:2021-03-09 04:59:33
【问题描述】:
当我在 iOS 设备上全新安装 SwiftUI 应用时,Core Data 首次尝试保存时出现异常。
我的应用委托调用具有此 CloudKit 调用的函数:
iCloud.container.fetchUserRecordID(){ recordID, error in
DispatchQueue.main.async {
if let recordID = recordID{
let context = PersistenceController.shared.container.viewContext
//...
do{
try context.save() //<-- <!!!> Thread 1: hit Objective-C exception <!!!>
}catch{
print("fetchiCloudUserId CD Error")
print(error)
}
}
}
}
关于崩溃的唯一其他信息在 Xcode 中:
我的猜测是,不知何故,Core Data 还没有准备好。我的PersistenceController 看起来像这样:
struct PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init(){
container = NSPersistentContainer(name: "Avid")
container.loadPersistentStores(completionHandler: { storeDescription, error in
if let error = error as NSError? {
print("=========\nUnresolved error \(error), \(error.userInfo)")
}
})
}
}
我在设备上再次重建我的应用程序后,不会发生异常。有什么想法吗?
【问题讨论】:
-
虽然它不应该有太大区别,因为您已经在主队列中访问
viewContext(ViewContext 无论如何都由主队列支持)尝试在上下文中使用perform或performAndWait并避免使用手动线程上下文切换(.DispatchQueue.main.async)你能不能也打印错误,提供的数据不足以进一步挖掘 -
没有错误可以打印,因为它没有捕捉到。它只是说
Thread 1: hit Objective-C exception并挂起。 -
这很奇怪:|您可以尝试捕获objective-C异常吗,swift try catch实际上并没有捕获/处理异常,它只处理错误:)如果您需要知道如何在swift中捕获objective-C异常,请尝试stackoverflow.com/questions/66346312/crash-detect-swift/…我宁愿尝试执行
context.save()在objective-c 块中,看看我是否可以捕获任何可能能够更好地了解正在发生的事情的异常 -
“不知何故 Core Data 还没有准备好” - 是的,最初设置 CoreData 需要一些时间。您需要确保仅在初始化完成后才使用 CoreData。不过,该解决方案可能看起来很麻烦:使用最初暂停的调度队列,在其中执行 all CoreData 调用。在完成处理程序中恢复它,它会告诉您 CoreData 已准备好。或者使用一些肮脏的技巧,让您第一次使用 CoreData 等待一段时间 - 丑陋,但是...... ;)