(Swift 3) 父子上下文崩溃核心数据 (libc++abi.dylib: 以 NSException (Recorded Frame) 类型的未捕获异常终止)
Posted
技术标签:
【中文标题】(Swift 3) 父子上下文崩溃核心数据 (libc++abi.dylib: 以 NSException (Recorded Frame) 类型的未捕获异常终止)【英文标题】:(Swift 3) parent child context crash core data (libc++abi.dylib: terminating with uncaught exception of type NSException (Recorded Frame) ) 【发布时间】:2016-10-01 17:44:11 【问题描述】:我正在尝试将消息保存在后台队列中,并通过使用父级和子级两个上下文将它们推送到主队列。但我的应用程序不断崩溃。我使用了苹果文档,不知道为什么它不起作用...
Core Data, Multithreading, and the Main Thread
这是我的代码:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
let doubletimestamp = Double(timestamp)
let date = Date(timeIntervalSinceReferenceDate: (doubletimestamp))
let status = "..."
let message = NSEntityDescription.insertNewObject(forEntityName: "Mesages", into: self.privateMOC) as! Mesages
message.text = text
message.timestamp = date as NSDate
do
try self.privateMOC.save()
self.inputToolbar.toggleSendButtonEnabled()
self.context.performAndWait
do
try self.context.save()
catch
fatalError("Failure to save context: \(error)")
catch let err
print(err)
这也是我的堆栈跟踪:
【问题讨论】:
【参考方案1】:好的,你有两个问题。
首先是你没有设置父上下文。如果您不这样做,则不会将任何内容传播到您的主要托管上下文
第二个是您没有在它自己的块中更改私有托管上下文。与您的正常托管上下文需要运行(您已经完成)相同的方式,私有上下文也需要执行相同的操作。
所以完成的代码应该是这样的:-
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
private.parentContext = context
let doubletimestamp = Double(timestamp)
let date = Date(timeIntervalSinceReferenceDate: (doubletimestamp))
let status = "..."
privateMOC.performBlock
let message = NSEntityDescription.insertNewObject(forEntityName: "Mesages", into: self.privateMOC) as! Mesages
message.text = text
message.timestamp = date as NSDate
do
try self.privateMOC.save()
self.inputToolbar.toggleSendButtonEnabled()
self.context.performAndWait
do
try self.context.save()
catch
fatalError("Failure to save context: \(error)")
catch let err
print(err)
【讨论】:
以上是关于(Swift 3) 父子上下文崩溃核心数据 (libc++abi.dylib: 以 NSException (Recorded Frame) 类型的未捕获异常终止)的主要内容,如果未能解决你的问题,请参考以下文章
iOS Swift 3核心数据-尝试递归调用-save的致命错误:上下文中止