【问题标题】:Faults are coming while saving data using Core Data使用 Core Data 保存数据时出现故障
【发布时间】:2016-03-14 09:17:25
【问题描述】:

我正在使用核心数据来保存我的 iOS 应用程序的数据。它的多线程应用程序;多个线程可以将数据保存到 Core Data DB 中。实际上,使用 Core Data 保存数据时会出现故障。

这是打印出错误的代码:

 public func saveChanges()
{
    self.managedObjectContext.performBlock { () -> Void in

        if self.managedObjectContext.hasChanges {
            do {
                try self.managedObjectContext.save()
            } catch {
                //Handle Error
                //Handle Error, offcourse we will return after that
                print("======================================================")
                print("Error while saving 1rd tier context")
                print("------------------------------------------------------")

                let saveError = error as NSError

                print("Unable to Save Note")
                //print("\(saveError), \(saveError.localizedDescription)")

                let detailedErrors = saveError.userInfo[NSDetailedErrorsKey] as? [NSError]

                if let _ = detailedErrors {
                    for detailedError:NSError in detailedErrors! {
                        print("----------------------------------------")
                        print(" DetailedError:\(detailedError.userInfo)")
                        print("----------------------------------------")
                    }
                }

                print("------------------------------------------------------")
                print("\(saveError.localizedDescription)")
                print("======================================================")

                return
            }
        }
    }
}

以下是控制台上的日志(显示日志的简短形式):

 DetailedError:[Dangling reference to an invalid object.: <null>, NSValidationErrorValue: Relationship 'emails' on managed object (0x7ff2149f9220) <UserDB: 0x7ff2149f9220> (entity: UserDB; id: 0x7ff214a20270 <x-coredata:///UserDB/t45022E2A-2772-4525-8D96-929D1AC8FD7D8> ; data: {
addressBookContacts =     (
);
bio = nil;

还有更多:

)}, NSAffectedObjectsErrorKey: (
"<Email: 0x7ff214d05c40> (entity: Email; id: 0x7ff214a6d420 <x-coredata:///Email/t45022E2A-2772-4525-8D96-929D1AC8FD7D9> ; data: {\n    emailRemovedByUser = nil;\n    \"email_address\" = nil;\n    \"email_type\" = nil;\n    id = 0;\n    \"is_verified\" = nil;\n    \"social_media_source\" = nil;\n    user = \"0x7ff214a20270 <x-coredata:///UserDB/t45022E2A-2772-4525-8D96-929D1AC8FD7D8>\";\n    visibility = 0;\n})"`), NSValidationErrorObject: <UserDB: 0x7ff2149f9220> (entity: UserDB; id: 0x7ff214a20270 <x-coredata:///UserDB/t45022E2A-2772-4525-8D96-929D1AC8FD7D8> ; data: {
addressBookContacts =     (

它还显示“对无效对象的悬空引用”;我被这个问题困住了。。不明白为什么会这样。

有人观察到此类问题吗?有什么建议吗?

【问题讨论】:

    标签: ios swift core-data fault


    【解决方案1】:

    从多线程管理Core Data真的很危险。

    您只有两种使用 CD 的方法:

    • 线程限制:所有读取/写入核心数据的调用都在同一个线程上进行(通常这是主线程)
    • 多上下文:您通过线程创建一个托管对象上下文,但这真的很难,您不想这样做

    所以我建议您使用主线程来执行所有调用。 (并检查您的上下文是否真的在主线程中设置)

    【讨论】:

    • 让我试试看。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2018-05-09
    • 2022-06-29
    相关资源
    最近更新 更多