Запрос на выборку требуется после декодирования в объект NSManagedObject - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующая общая функция, которая работает: она правильно создает объекты, и я знаю, что она сохраняется в основных данных, потому что, если сразу после этого сделать запрос на выборку, я получу только что созданный объект.Однако сам объект не является допустимым объектом базовых данных (ошибка данных x-core).Есть ли способ обойти, поэтому мне не нужно делать запрос на выборку сразу после декодирования объекта?Большое спасибо.

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
    }
}

1 Ответ

0 голосов
/ 04 марта 2019

Ошибка данных ядра является допустимым объектом данных ядра;он просто еще не был извлечен из бэк-хранилища в память.

Чтобы уменьшить использование памяти, Core Data извлекает полный объект только при доступе к одному из его свойств.Эта выборка автоматически и эффективно прозрачна для вашего кода.

Это означает, что вам не нужно делать ничего особенного;Вы можете просто использовать управляемый объект.

...