2016-05-26 2 views
3

У меня есть простой сценарий, в котором я хочу, чтобы разобрать модель пользователя из Json с Мантией и упорствовать его в базу данных царств:Realm + 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.

есть ли способ избежать такого рода дублирования?

+1

В качестве альтернативы, может быть достаточно, чтобы соответствовать протоколу MTLModel, но вам придется реализовать много функций класса MTLModel. –

+0

Спасибо, что кажется правильной реализацией, я попробую. Я даже подумаю о том, чтобы отказаться от обеих фреймворков и использовать что-нибудь еще с лучшими реализациями. –

+0

@MinaSamy С помощью протокола '' вы работаете? Хотелось бы услышать, как получилось – beebcon

ответ

2

Ммм, вы можете попробовать создать единственный класс, который наследуется от обоих классов вниз цепи, пока 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]; 
} 
+0

Спасибо, Многократное наследование невозможно, ваше предложение скопировать свойства лучше. позвольте спросить вас, есть ли способ определить схему объекта realm, а не определять свойства для объекта Realm? –

Смежные вопросы