(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的致命错误:上下文中止

使用 Swift 3 删除核心数据托管对象

崩溃前保存核心数据上下文

尝试从响应 Swift Alamofire 将数据保存到核心数据时崩溃

iPhone - 核心数据崩溃 - 多个托管对象上下文

核心数据上下文“脏”:MOC 保存崩溃应用