Realm + Mantle: как избежать дублирования множественного наследования при интеграции обеих платформ?
У меня есть простой сценарий, в котором я хочу проанализировать модель User из Json с Mantle и сохранить ее в базе данных области:
Чтобы использовать библиотеку Mantle, интерфейс модели должен расширять класс MTLModel следующим образом:
@interface User: MTLModel<MTLJSONSerializing>
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *email;
@end
и для того, чтобы сохранить эту модель в области, я должен объявить второй интерфейс, который выходит из RLMObject:
@interface RLMUser:RLMObject
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *email;
@end
Как вы видите, мне пришлось реализовать другой тип класса User, потому что я должен расширить RLMObject.
Есть ли способ избежать такого дублирования?
2 ответа
Основываясь на идее использования протокола, я создал супер класс ( суть здесь):
@interface ModelBase : RLMObject <MTLJSONSerializing, MTLModel>
Затем, как сказал @David Snabel-Caunt, я реализовал некоторые функции класса MTLModel (copy-paste из MTLModel.m).
Наконец, чтобы использовать его, вам просто нужно создать его подкласс.
Хм, вы МОЖЕТЕ попытаться создать один класс, который наследует от обоих классов вниз по цепочке, пока RLMObject
самый высокий суперкласс (например, User
> MTLModel
> RLMObject
) и посмотреть, если это работает. Если MTLModel
работает только со своими данными через значения пути ключа, Realm может справиться с такой работой.
Но, честно говоря, если вы хотите убедиться, что оба класса ведут себя должным образом, лучше не смешивать их, а просто копировать данные в них, когда это необходимо.
К счастью, потому что RLMObject
экземпляры выставляют все свойства, которые он сохраняет через RLMObjectSchema
объект, вам не нужно вручную копировать каждое свойство вручную, и вы можете сделать это с довольно небольшим количеством кода:
User *mantleUser = ...;
RLMUser *realmUser = ...;
// Loop through each persisted property in the Realm object and
// copy the data from the equivalent Mantle property to it
for (RLMProperty *property in realmUser.objectSchema.properties) {
id mantleValue = [mantleUser valueForKey:property.name];
[realmUser setValue:mantleValue forKey:property.name];
}