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即可。
我有一个简单的场景,我想使用 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即可。