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

Ios RestKit中具有核心数据的临时对象的最佳实践,ios,cocoa-touch,core-data,restkit,Ios,Cocoa Touch,Core Data,Restkit,背景:我有一个管理对象,汽车。我在localhost/cars/search上有一个RESTful搜索API。返回的结果是服务器端的Car对象,但我只想保存用户选择的结果。其余的车我想丢弃,当他们点击退出搜索 一开始我是这样的: @interface Car : NSManagedObject //<--- managed object @property (nonatomic, strong) NSNumber* year; @property (nonatomic,

背景:我有一个管理对象,汽车。我在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
这是一种好的做法吗?使用NSMutableDictionary作为临时表示,直到用户做了一些保证将新对象插入上下文的事情为止?我有点喜欢使用原始的托管对象子类来表示数据,但不知何故,我能够将其标记为“不保留”或其他什么,但每次这样做时,我都感觉自己在与框架(和竞争条件)作斗争。我还尝试使用scratch/throwaway上下文,创建一个新的RKObjectManager,然后清除整个上下文,但RestKit的ActiveRecord类别的+managedObjectContext方法是硬编码的,返回:

[[[RKObjectManager sharedManager] objectStore] managedObjectContext];

这就排除了在临时/垃圾数据中使用临时上下文的可能性。

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

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

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

这为您提供了几个选项:有多个对象管理器,有一个对象管理器,但从中创建临时上下文,并仅保留所需的对象,基于托管对象创建临时对象


NSMutableDictionary选项似乎没有其他方法灵活,但我不会说这是“坏习惯”。

您也可以看到以下答案:


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

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

我认为埃文·科德尔的答案是有缺陷的。当前的restkit版本(0.10.x)不允许为RkmanagedObjectLoader创建要使用的上下文,RkObjectManager可以使用存储,但它必须是RKManagedObjectStore类型,该类型显式绑定到sqllite。restkit的开发版本(0.20)显然放松了这一点,因此您可以让它将数据保存到内存数据库中。我确实尝试过重写RKManagedObjectStore方法以使用我提供的上下文,但没有成功。。。无论如何,修复似乎是非常重要的

给出的另一个链接似乎与发布对象和在响应中接收相同的对象有关。这是一个与这个问题不同的问题


在v.0.20.x发布之前(有望很快发布),似乎并行类层次结构是唯一的选择。如果我错了,我欢迎在这一点上更正

拥有一个从NSObject继承的瞬态模型类是可以的,但我最关心的是使瞬态模型与NSManagedObject版本保持最新。与其说是技术问题,不如说是代码可维护性问题。如果编辑器>生成NSManagedObject子类有一个“带镜像NSObject子类”的复选框,那就太好了。当然,如果您的模型会随着任何频率发生变化,那么我介绍的其他方法之一就是一个不错的选择。RestKit经常变化,确定它支持什么的最佳方法是检查文档。但是,在1.0之后应该不会有太大变化。现在有一种方法可以使用任何持久存储协调器创建RKManagedObjectStore,并可以随意添加/删除上下文。
[[[RKObjectManager sharedManager] objectStore] managedObjectContext];