безопасно обновлять значения ключей NSManagedObjects - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь передать пары ключ-значение и обновить атрибуты через цикл.

func update(storableClass : NSManagedObject.Type, id: ID, fields: [String : Any]) throws {

    // retreive manaagedObject
    for (key, value) in fields {
        manaagedObject.setValue(value, forKey: key)
    }
}

Очевидно, setValue(_:forKey:) сгенерирует исключение, если ключ не существует.

Из того, что я узнал , вы не должны ловить исключение Objective-C в Swift.

Есть ли какой-нибудь безопасный способ обновить свойства основных данных через словарь?

Я знаю, что могу иметь функцию, подобную приведенной ниже:

func update(storableClass : ManagedObject.Type, id: ID, closure: (ManagedObject) -> ()) throws {}

, а затем вызвать ее кактакие:

update(storableClass: UserEntity.self, id: "123123", closure: { userEntity in
    userEntity.name = "new name" 
})

Мне нравится иметь оба варианта ... и любой другой безопасный / быстрый вариант ...

1 Ответ

0 голосов
/ 11 декабря 2018

У меня была именно эта проблема.Вот что вы делаете.

С помощью Core Data вы можете легко узнать, какие имена свойств действительны для объекта.Получите ссылку на объект управляемого объекта, а затем запросите у объекта свойства.Вы бы использовали managedObject.entity.propertiesByName.В результате получается словарь, в котором ключи являются допустимыми свойствами.Код будет выглядеть примерно так:

let properties = managedObject.entity.propertiesByName
for (key, value) in fields {
    if properties[key] != nil {
        managedObject.setValue(value, forKey: key)
    } else {
        print("Unknown key: \(key)")
    }
}

Это нормально, если value - правильный тип.Если вы начинаете получать фиктивные типы данных в JSON, вам придется решать более сложную задачу.

Для отношений сделайте то же самое с managedObject.entity.relationshpsByName.

...