2016-05-26 7 views
3

Ich habe ein einfaches Szenario, wo ich ein User-Modell von Json mit Mantle analysieren will und bleibe es in ein Reich Datenbank:Realm + Mantle: Wie vermeidet man Mehrfachvererbung bei der Integration beider Frameworks?

Um die Mantle-Bibliothek zu verwenden, die Modell-Schnittstelle die MTLModel Klasse erweitern muß wie Dieser:

@interface User: MTLModel<MTLJSONSerializing> 
@property(nonatomic,copy) NSString *name; 
@property(nonatomic,copy) NSString *email; 
@end 

und um dieses Modell in Bereich bestehen bleiben, ich habe eine zweite Schnittstelle zu erklären, die von RLMObject erstreckt:

@interface RLMUser:RLMObject 
@property(nonatomic,copy) NSString *name; 
@property(nonatomic,copy) NSString *email; 
@end 

Wie Sie sehen, musste ich einen anderen Typ der Benutzerklasse implementieren, da ich RLMObject erweitern muss.

Gibt es eine Möglichkeit, diese Art von Duplizierung zu vermeiden?

+1

Alternativ kann es ausreichend sein, dem 'MTLModel'-Protokoll zu entsprechen, aber Sie müssten eine Menge der' MTLModel'-Klassenfunktionalität implementieren. –

+0

Danke, das scheint eine richtige Umsetzung, ich werde es versuchen. Ich werde sogar in Betracht ziehen, beide Frameworks zu löschen und alles andere mit besseren Implementierungen zu verwenden. –

+0

@MinaSamy Haben Sie festgestellt, dass das '' Protokoll funktioniert? Würde gerne hören, wie es sich herausstellte – beebcon

Antwort

2

Hmmm, Sie könnten versuchen, eine einzige Klasse zu schaffen, die von beiden Klassen nach unten einer Kette erbt solange RLMObject ist die höchste Super (zB User>MTLModel>RLMObject) und zu sehen, ob das funktioniert. Wenn MTLModel nur an seinen Daten über Schlüsselpfad-Werte funktioniert, könnte Realm damit umgehen, damit zu arbeiten.

Aber in aller Ehrlichkeit, wenn Sie sicherstellen möchten, dass beide Klassen ordnungsgemäß wie beabsichtigt verhalten, ist es wahrscheinlich am besten, sie nicht zu mischen, und kopieren Sie einfach die Daten über sie bei Bedarf.

Zum Glück, weil RLMObject Instanzen all Eigenschaften machen es durch ein RLMObjectSchema Objekt weiterhin besteht, müssen Sie nicht manuell jede Eigenschaft manuell kopieren und es mit einer ziemlich minimalen Menge an Code tun:

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

Danke, Die Mehrfachvererbung ist nicht durchführbar, Ihr Vorschlag, in die Eigenschaften zu kopieren, ist viel besser. Lassen Sie mich fragen, ob es eine Möglichkeit gibt, das Realm-Objekt-Schema selbst zu definieren, anstatt Eigenschaften für das Realm-Objekt zu definieren? –

Verwandte Themen