Подтвердить что ты не робот

Хранение NSManagedObject в словаре (NSDictionary)

У меня есть пользовательский класс, который является подклассом NSManagedObject. Я хотел бы сохранить его в словаре, но при попытке сделать это я получаю ошибку Property list invalid for format: 200.

Вот как я пытаюсь создать словарь:

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: voiceMemo forKey:@"voiceMemo"];

Тот же результат при попытке

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: (NSData *) voiceMemo forKey:@"voiceMemo"];

Он работает, однако, при попытке сохранить отдельные атрибуты отдельно:

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: voiceMemo.attribute forKey:@"attribute"];

NSDictionary должен иметь возможность хранить объекты данных, поэтому я предполагаю, что реальный вопрос заключается в том, как передать объект NSManagedObject в NSData

4b9b3361

Ответ 1

Вы уверены, что ошибка возникает при создании словаря, как это подразумевается в коде, который вы опубликовали?

Property list invalid for format: 200 звучит так, будто вы пытаетесь записать свой NSManagedObject в файловую систему. Что не будет работать, потому что NSManagedObjects не подтверждают NSCoding.

Вы можете сохранить атрибуты NSManagedObject в NSDictionary и сохранить этот словарь в файле.

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];

и когда вы хотите его восстановить, вы устанавливаете значения вашего управляемого объекта как это:

[myObject setValuesForKeysWithDictionary:dict];

Ответ 2

В моем приложении я также храню МО в словаре (но не держись, я храню в массиве), но без какого-либо перевода. попробуйте, если это произойдет и для массива.

И вы можете сначала попытаться создать словарь, а затем назначить объекты.

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:managedObject forKey:@"thisOne"];

Ответ 3

Быстрая версия на случай, если кому-то это понадобится

import CoreData 
extension NSManagedObject {
    func toDict() -> [String:Any] {
        let keys = Array(entity.attributesByName.keys)
        return dictionaryWithValues(forKeys:keys)
    }
}