Swift CoreData:错误:严重的应用程序错误.在Core Data更改处理期间捕获到异常.

Ale*_*lex 4 multithreading core-data objective-c ios swift

我正在iOS上编写一个程序,我正面临着这个错误:

2015-11-06 10:57:24.289 NETFNET [2503:976392] CoreData:错误:严重的应用程序错误.在Core Data更改处理期间捕获到异常.这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误. - [__ NSCFSet addObject:]:尝试使用userInfo插入nil(null)2015-11-06 10:57:24.293 NETFNET [2503:976392]***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [ __NSCFSet addObject:]:尝试插入nil'

我想,我试图从主线程和后台线程同时访问数据库.我已经看到了很多针对Objective C的解决方案,但没有针对Swift的解决方案(我不知道Objective C ......).不幸的是,我不知道如何使用Grand Central Dispatch,事实上,我的程序并不需要几个步骤(我的意思是它需要它,但是如果某个线程丢失一个函数的信息一次,没有什么不好的意思发生).我只想在Swift 1或2上有稳定的程序,所以我会感谢任何帮助.

Yun*_* T. 6

非常好。我尝试过,它对我来说效果很好。\n非常感谢。

\n\n

以前的代码:

\n\n
        do {\n            try CDHelper.shared.context.save()\n        }\n        catch let error as NSError {\n            // Error mesajlar\xc4\xb1n\xc4\xb1 ekle!!\n            print("Could not fetch \\(error), \\(error.localizedDescription)")\n            print("Could not fetch \\(error), \\(error.localizedFailureReason)")\n        }\n\n\n// MARK: - CONTEXT\nlazy var context: NSManagedObjectContext = {\n    let moc = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType)\n    moc.persistentStoreCoordinator = self.coordinator\n    return moc\n}()\n\n// MARK: - MODEL\nlazy var model: NSManagedObjectModel = {\n    return NSManagedObjectModel(contentsOfURL:self.modelURL)!\n}()\n\n// MARK: - COORDINATOR\nlazy var coordinator: NSPersistentStoreCoordinator = {\n    return NSPersistentStoreCoordinator(managedObjectModel:self.model)\n}()\n\nlazy var modelURL: NSURL = {\n    let bundle = NSBundle.mainBundle()\n    if let url = bundle.URLForResource("Model", withExtension: "momd") {\n        return url\n    }\n    print("CRITICAL - Managed Object Model file not found")\n    abort()\n}()\n
Run Code Online (Sandbox Code Playgroud)\n\n

你应该这样改变代码:

\n\n
let moc = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType)\nlet privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)\nprivateMOC.parentContext = moc\n\nprivateMOC.performBlock({\n    do {\n        try privateMOC.save()\n    } catch {\n        fatalError("Failure to save context: \\(error)")\n    }\n})\n
Run Code Online (Sandbox Code Playgroud)\n


moh*_*ish 5

您需要使用专用队列并发类型创建私有NSManagedObjectContext,并在后台线程上操作时使用它来访问CoreData.

因此,假设我需要在后台运行数据库操作,我可以将该工作分配给后台线程

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {
        //call your background operation.
    })
Run Code Online (Sandbox Code Playgroud)

然后在后台操作中我可以创建一个私有NSManagedObjectContext

let moc = … //Our primary context on the main queue

let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = moc

privateMOC.performBlock {
    //operations
    do {
        try privateMOC.save()
    } catch {
        fatalError("Failure to save context: \(error)")
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读Apple的CoreData并发指南,以便在多线程上实现核心数据操作之前获得良好的理解.