3

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

为了使用 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

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

4

2 回答 2

3

嗯,您可以尝试创建一个从两个类沿链继承的单个类,只要RLMObject是最高的超类(例如User> MTLModel> RLMObject)并查看它是否有效。如果MTLModel仅通过 key-path 值处理其数据,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];
}
于 2016-05-27T03:07:56.383 回答
0

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

@interface ModelBase : RLMObject <MTLJSONSerializing, MTLModel>

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

最后要使用它,你只需要继承它。

于 2018-08-12T07:43:07.950 回答