首页 > 解决方案 > 解码为 NSManagedObject 对象后需要获取请求

问题描述

我有以下通用函数:它正确地创建了对象,我知道它被保存到核心数据中,因为如果在之后立即执行获取请求,我会得到我刚刚创建的对象。但是,对象本身不是有效的核心数据对象(x 核心数据错误)。有什么办法让我不必在解码对象后立即执行获取请求吗?非常感谢。

func decode<T: Decodable>(data: Data?, objectType: T.Type, save: Bool = true, completionHandler: @escaping (T) -> ())
{
    guard let d = data else { return }
    do
    {
        let privateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        privateContext.parent = SingletonDelegate.shared.context

        let root = try JSONDecoder(context: privateContext).decode(objectType, from: d)

        if save
        {
            try privateContext.save()
            privateContext.parent?.performAndWait
            {
                do
                {
                    if let p = privateContext.parent
                    {
                        try p.save()
                    }

                }catch
                {
                    print(error)
                }
            }
        }
        DispatchQueue.main.async
        {
            completionHandler(root)
        }
    }catch
    {
        print(error)
    }
}

extension CodingUserInfoKey 
{
    static let context = CodingUserInfoKey(rawValue: "context")!
}


extension JSONDecoder 
{
    convenience init(context: NSManagedObjectContext) 
    {
        self.init()
        self.userInfo[.context] = context
    }
}

标签: iosswiftnsmanagedobjectdecodable

解决方案


核心数据故障有效的核心数据对象;它只是还没有从后备存储中检索到内存中。

为了减少内存使用,Core Data 仅在您访问其属性之一时获取完整对象。此获取是自动的,并且对您的代码有效透明。

这意味着您不需要做任何特别的事情;您可以只使用托管对象。


推荐阅读