Realm + Mantle:如何在集成两个框架时避免多重继承重复?

Realm + Mantle: how to avoid multiple inheritance duplication when integrating both frameworks?

我有一个简单的场景,我想使用 Mantle 从 Json 解析用户模型并将其保存到领域数据库:

为了使用 Mantle 库,模型接口必须像这样扩展 MTLModel class:

@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

如您所见,我必须实现另一种类型的用户 class 因为我必须扩展 RLMObject.

有没有办法避免这种重复?

嗯,你可以尝试创建一个继承自两个 class 的单个 class,只要 RLMObject 是最高的超级 class(例如User > MTLModel > RLMObject) 看看是否可行。如果 MTLModel 仅通过键路径值处理其数据,Realm 可能能够像那样处理它。

但老实说,如果您想确保两个 class 都按预期正常运行,最好不要将它们混合使用,并在需要时简单地在它们之间复制数据。

值得庆幸的是,因为 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];
}

基于使用协议的想法,我创建了一个超级class(gist here):

@interface ModelBase : RLMObject <MTLJSONSerializing, MTLModel>

然后正如@David Snabel-Caunt 所说,我最终实现了 MTLModel class 的一些功能(从 MTLModel.m 复制粘贴)。

终于要用了,只需要subclass即可。