【发布时间】:2023-02-11 17:35:46
【问题描述】:
以下问题只是有时出现,而且从未出现在我的设备上。我的应用程序的用户经常会遇到这种情况。
我试图在我自己的设备上重新生成该问题,我只是在我设置核心数据堆栈的地方将其注释掉。错误如下:
在我看来它是一样的,它在生产中发生的原因是......核心数据堆栈在应用程序中使用之前没有完成设置。我对吗?
看下面的代码。这就是我设置核心数据的方式:
class CoreDataManager {
static var shared = CoreDataManager()
private var coordinator: NSPersistentStoreCoordinator?
var rootContext: NSManagedObjectContext?
var defaultContext: NSManagedObjectContext?
func setup() {
guard coordinator == nil && defaultContext == nil else {
return
}
if let managedObjectModel = NSManagedObjectModel.defaultModel {
coordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
var storePath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: SharedGroupName)
storePath = storePath!.appendingPathComponent("FieldService.sqlite")
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
do {
try coordinator?.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storePath, options: options)
rootContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
rootContext?.persistentStoreCoordinator = coordinator
rootContext?.obtainPermanentIdsBeforeSaving()
rootContext?.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
defaultContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
defaultContext?.setupDefaultContext()
defaultContext?.obtainPermanentIdsBeforeSaving()
defaultContext?.parent = rootContext
} catch let error as NSError {
print("SUPER ERROR>>>>>>>>>")
print(error)
}
}
}
}
这在这里简单地称为:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
CoreDataManager.shared.setup()
// another stuff
}
Vadian 的回答问题:
【问题讨论】:
-
只是不要完全在您的代码中使用强制解包。这是一个众所周知的崩溃秘诀。使用例如
if let x = ... {...}。 -
好的,我明白了,但这不是我的问题。它不应该是 NIL 为什么会这样?