Eri*_*erg 6 cocoa-touch core-data ios 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
Run Code Online (Sandbox Code Playgroud)
我将REST API搜索结果JSON映射到TransientCar对象以显示搜索结果,但不将它们保存到上下文中.默认情况下,如果映射托管对象,RestKit将调用其+对象便利工厂来创建对象并将其插入当前上下文(硬编码为sharedManager的对象库的上下文,顺便说一句!)
这似乎不可持续.所以现在我只是使用NSMutableDictionary来保存搜索结果数据,直到用户点击详细视图并执行一些值得保存真实托管对象的内容:
RKObjectMapping* tempCarMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[tempCarMapping mapKeyPathsToAttributes:
@"year", @"year",
@"make", @"make",
@"model", @"model",
nil];
Run Code Online (Sandbox Code Playgroud)
这是一个好习惯吗?使用NSMutableDictionary作为临时表示,直到用户做了保证在上下文中插入新对象的操作?我有点喜欢使用原始托管对象子类来表示数据,但不知何故能够将其标记为"不要保留"或者其他东西,但每次我这样做时我觉得我正在与框架作斗争(和比赛条件).我还尝试通过创建一个新的RKObjectManager来使用临时/一次性上下文,然后只是清除其整个上下文,但RestKit的ActiveRecord类的+ managedObjectContext方法被硬编码返回:
[[[RKObjectManager sharedManager] objectStore] managedObjectContext];
Run Code Online (Sandbox Code Playgroud)
这种方式破坏了对临时/垃圾数据使用临时上下文的可能性.
不幸的是,我还没有足够的StackOverflow声誉将这个答案放在它所属的地方(作为对其他回复的评论),但我想补充一些观点.
我相信Evan Cordell的答案是有缺陷的.当前的restkit版本(0.10.x)不允许您为RKManagedObjectLoaders创建上下文,RKObjectManagers可以使用存储,但它必须是RKManagedObjectStore类型,它与sqllite明确绑定.restkit的开发版本(0.20)显然放宽了这一点,因此您可以将数据保存到内存数据库中.我确实尝试重写RKManagedObjectStore方法以使用我提供的上下文,但它不起作用......无论如何,修复似乎是非平凡的.
给出的另一个链接,即使用Restkit为核心数据创建临时对象的更好方法,似乎与发布对象和在响应中接收相同的对象有关.这是一个与这个问题不同的问题.
在v.0.20.x发布之前,希望很快就会发布,似乎并行类层次结构是唯一的选择.如果我不对,我欢迎纠正这一点!
首先,我过去曾使用您的方法来完成此操作,该方法拥有两个模型副本,一个用于核心数据,另一个用于瞬态(只是一个 NSObject)。这对我来说没有任何问题。
至于你的其他尝试,我认为图书馆并没有你想象的那么强迫你的手。查看RKManagedObjectStore和的 API NSManagedObject+ActiveRecord。特别是,RKManagedObjectStore 有一个managedObjectContext属性、一个方法- (NSManagedObjectContext*)newManagedObjectContext和几个用于合并更改的方法。
你是对的,[NSManagedObject managedObjectContext]总是返回sharedManager的上下文 - 但这是有道理的,它是一个类方法。否则类如何知道要返回哪个上下文?但这是没有意义的,因为有很多其他方法可以创建新的上下文并访问它们。或者完全回避这一点,您可以保留对临时上下文的引用并直接使用它。
这为您提供了几种选择:拥有多个对象管理器、拥有一个对象管理器但从中创建一个临时上下文并仅保留所需的对象、基于托管对象创建一个临时对象。
NSMutableDictionary 选项似乎不像其他方法那么灵活,但我不会说这是“不好的做法”。
| 归档时间: |
|
| 查看次数: |
4075 次 |
| 最近记录: |