【发布时间】:2012-04-11 09:47:50
【问题描述】:
背景:我有一个托管对象 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 将调用它的 +object 便利工厂来创建对象并将其插入到当前上下文中(硬编码到 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];
这会破坏对临时/垃圾数据使用临时上下文的可能性。
【问题讨论】:
标签: ios cocoa-touch core-data restkit