使用Core Data的RestKit中临时对象的最佳实践

时间:2012-03-27 19:55:46

标签: ios cocoa-touch core-data restkit

背景:我有一个托管对象,Car。我在localhost / cars / search上有一个RESTful搜索API。返回的结果是来自服务器端的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

我将REST 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];

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

3 个答案:

答案 0 :(得分:5)

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

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

给出的另一个链接Better Approach for Creating Temp Object for Core Data with Restkit似乎与发布对象并在响应中接收相同的对象有关。这个问题与这个问题不同。

直到v.0.20.x发布,希望很快就会发布,似乎并行类层次结构是唯一的选择。如果我不对,我欢迎纠正这一点!

答案 1 :(得分:3)

首先,我过去使用你的模型的两个副本的方法完成了这个,一个用于Core Data,一个用于瞬态(只是一个NSObject)。这对我没有任何问题。

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

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

这为您提供了一些选项:拥有多个ObjectManagers,拥有一个对象管理器但从中创建一个临时上下文,只保留您想要的对象,根据托管对象创建一个临时对象。

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

答案 2 :(得分:2)

您还可以看到此答案:Better Approach for Creating Temp Object for Core Data with Restkit

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