RestKit中具有核心数据的临时对象的最佳实践



背景:我有一个托管对象Car。我有一个RESTful搜索API位于localhost/cars/search上。返回的结果是来自服务器端的Car对象,但我只想保存用户选择的对象。当他们退出搜索时,我想丢弃的其余汽车。

一开始我觉得:

@interface Car : NSManagedObject  //<--- managed object
    @property (nonatomic, strong) NSNumber* year;
    @property (nonatomic, strong) NSString* make;
    @property (nonatomic, strong) NSString* model;
@end
@interface TransientCar : NSObject //<--- regular NSObject!
    @property (nonatomic, strong) NSNumber* year;
    @property (nonatomic, strong) NSString* make;
    @property (nonatomic, strong) NSString* model;
@end

我将RESTneneneba API搜索结果JSON映射到TransientCar对象中,用于显示搜索结果,但不将其保存到上下文中。默认情况下,如果映射托管对象,RestKit将调用其+对象便利工厂来创建对象并将其插入当前上下文(硬编码为sharedManager的对象存储上下文,顺便说一句!)

这似乎是不可持续的。所以现在我只是使用NSMutableDictionary来保存搜索结果数据,直到用户进入详细视图并为保存一个真正的托管对象

RKObjectMapping* tempCarMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[tempCarMapping mapKeyPathsToAttributes:
 @"year", @"year",
 @"make", @"make",
 @"model", @"model",
 nil];

这是个好做法吗?使用NSMutableDictionary作为临时表示,直到用户执行了保证在上下文中插入新对象的操作?我有点喜欢使用原始的托管对象子类来表示数据,但不知何故,我能够将其标记为"不保留"或其他什么,但每次这样做时,我都觉得自己在与框架(和种族条件)作斗争。我还尝试使用一个临时/一次性上下文,创建一个新的RKObjectManager,然后只清除它的整个上下文,但RestKit的ActiveRecord类别的+managedObjectContext方法被硬编码为返回:

[[[RKObjectManager sharedManager] objectStore] managedObjectContext];

这就破坏了对临时/垃圾数据使用scratch上下文的可能性。

不幸的是,我还没有足够的StackOverflow声誉来将这个答案放在它所属的位置(作为对其他回复的评论),但我想补充一些要点。

我认为Evan Cordell的回答是有缺陷的。当前的restkit版本(0.10.x)不允许您为RKManagedObjectLoaders创建要使用的上下文,并且RKObjectManagers可以接受存储,但它必须是RKManagedObjectStore类型,它明确地绑定到sqllite。restkit(0.20)的开发版本显然放松了这一点,因此您可以让它将数据保存到内存中的数据库中。我确实尝试重写RKManagedObjectStore方法以使用我提供的上下文,但它不起作用。。。无论如何,这个修复似乎并不平凡。

给出的另一个链接,使用Restkit为核心数据创建临时对象的更好方法,似乎与发布对象并在响应中接收相同的对象有关。这是一个与这个问题不同的问题。

在v.0.20.x发布之前(希望很快就会发布),并行类层次结构似乎是唯一的选择。如果我不正确,我欢迎对这一点进行更正!

首先,我在过去使用过您的方法,即拥有两个模型副本,一个用于核心数据,另一个是瞬态的(只是一个NSObject)。这对我来说没有任何问题。

至于你的其他尝试,我不认为图书馆会像你想象的那样强迫你。查看RKManagedObjectStoreNSManagedObject+ActiveRecord的API。特别是,RKManagedObjectStore有一个managedObjectContext属性、一个方法- (NSManagedObjectContext*)newManagedObjectContext和几个用于合并更改的方法。

[NSManagedObject managedObjectContext]总是返回sharedManager的上下文,这是对的,但这是有道理的,它是一个类方法。否则,类如何知道返回哪个上下文?但这是没有意义的,因为有很多其他方法可以创建新的上下文并访问它们。或者完全避开这一点,你可以保留一个对你的临时上下文的引用,并直接使用它。

这给了你一些选择:有多个ObjectManager,有一个对象管理器,但从中创建一个临时上下文,只保留你想要的对象,基于托管对象创建一个瞬态对象。

NSMutableDictionary选项似乎不像其他方法那样灵活,但我不会说这是"糟糕的做法"。

您还可以看到这个答案:使用Restkit 为核心数据创建临时对象的更好方法

它将避免Evan Cordell在回答中提到的瞬态对象问题,他是RestKit的主要贡献者。

最新更新