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

背景:我有一个托pipe对象,Car。 我有一个RESTfulsearchAPI坐在本地主机/汽车/search。 返回的结果是来自服务器端的Car对象,但我只想保存用户select的那个。 我想放弃search的其他车辆。

起初我都喜欢:

@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 

为了显示search结果,我将REST APIsearch结果JSON映射到TransientCar对象中,但不将它们保存到上下文中。 默认情况下,如果映射托pipe对象,RestKit将调用其+对象便利工厂创build对象并将其插入当前上下文(硬编码到sharedManager的对象存储的上下文,btw!)

这似乎是不可持续的。 所以现在我只是使用NSMutableDictionary来保存search结果数据,直到用户点击一个详细视图,并做一些值得保存一个真正的托pipe对象:

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

这是一个很好的做法吗? 使用NSMutableDictionary作为临时表示,直到用户做了一些事情,保证在上下文中插入一个新的对象? 我很喜欢使用原始的托pipe对象子类来表示数据,但不知何故能够将其标记为“不要保留”或什么的,但每次我这样做,我觉得我正在打架(和竞赛条件)。 我也尝试过使用scratch / throwaway上下文来创build一个新的RKObjectManager,之后只清除它的整个上下文,但RestKit的ActiveRecord类+ managedObjectContext方法被硬编码返回:

 [[[RKObjectManager sharedManager] objectStore] managedObjectContext]; 

这种嘲讽有可能使用临时/垃圾数据的临时上下文。

首先,我已经使用了两个模型拷贝的方法,一个是Core Data,另一个是transient(仅仅是一个NSObject)。 这对我没有任何问题。

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

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

这给你几个select:有多个ObjectManagers,有一个对象pipe理器,但创build一个临时的上下文,只保留所需的对象,创build一个基于托pipe对象的瞬态对象。

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

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

我相信埃文·科德尔的回答是有缺陷的。 当前的restkit版本(0.10.x)不允许为RKManagedObjectLoaders使用创build上下文,而RKObjectManagers可以获取存储,但必须是RKManagedObjectStoretypes,它明确地与sqllite绑定。 restkit(0.20)的dev版本显然放宽了这一点,所以你可以让它将数据保存到内存数据库中。 我曾尝试覆盖RKManagedObjectStore方法来使用我提供的上下文,但它不工作…无论如何,修复似乎是不平凡的。

给出的另一个链接, 更好的方法是用Restkit创build核心数据的临时对象 ,似乎是在发送一个对象并在响应中接收同一个对象。 这是一个不同于这个问题提出的问题。

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

你也可以看到这个答案: 使用Restkit创build核心数据临时对象的更好方法

它将避免Evan Cordell在RestKit的主要贡献者的回答中提到的暂时性对象问题。