2012-03-27 37 views
6

背景:我有一個託管對象Car。我有一個RESTful搜索API坐在本地主機/汽車/搜索。返回的結果是來自服務器端的Car對象,但我只想保存用戶選擇的那個。我想在他們退出搜索時放棄剩餘的汽車。使用核心數據的RestKit中的臨時對象的最佳做法

起初我都喜歡:

@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的對象存儲的上下文,btw!)

這似乎不可持續。所以,現在我只是用的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

首先,我在過去使用你的方法有兩個模型副本,一個是核心數據和一個是瞬態的(只是一個NSObject)。這對我來說沒有任何問題。

至於你其他的嘗試,我不認爲圖書館強迫你的手如你所想。查看RKManagedObjectStoreNSManagedObject+ActiveRecord的API。特別是,RKManagedObjectStore有一個managedObjectContext屬性,一個方法- (NSManagedObjectContext*)newManagedObjectContext和幾種合併更改的方法。

你說得對,[NSManagedObject managedObjectContext]總是返回sharedManager的上下文 - 但這是有道理的,它是一個類方法。否則,班級將如何知道返回哪個上下文?但由於有很多其他方式可以創建新的上下文並訪問它們,所以它沒有什麼意義。或者完全避開它,您可以保留對臨時上下文的引用並直接使用它。

這給你幾個選擇:擁​​有多個ObjectManagers,有一個對象管理器,但是從它創建一個臨時上下文,只保留你想要的對象,根據被管理對象創建一個臨時對象。

NSMutableDictionary選項看起來不像其他方法那麼靈活,但我不會說這是「壞習慣」。

+0

有剛剛從NSObject的繼承的瞬態模型類是好的,但我最關心的是保持瞬態模型最新與NSManagedObject版本。與技術相比,它更像是代碼可維護性問題。這將是很好的編輯>生成NSManagedObject子類有一個複選框「與鏡像的NSObject子類」。 – 2012-04-01 22:47:05

+0

當然 - 如果你的模型會隨着頻率改變,我所概述的其他方法之一將是一個不錯的選擇。 – 2012-04-02 00:52:01

5

不幸的是,我沒有尚未有足夠的StackOverflow信譽把這個答案在它所屬(作爲評論對方回覆),但我想補充幾點。

我相信埃文科德爾的回答是有缺陷的。當前的restkit版本(0.10.x)不允許爲RKManagedObjectLoaders創建上下文以供RKObjectManagers使用,並且RKObjectManagers可以獲取存儲,但必須是RKManagedObjectStore類型,它明確地與sqllite綁定。 restkit(0.20)的開發版本顯然放寬了這一點,所以你可以讓它將數據保存到內存數據庫中。我曾嘗試覆蓋RKManagedObjectStore方法以使用我提供的上下文,但它無效......無論如何,該修復似乎是不平凡的。

給出,Better Approach for Creating Temp Object for Core Data with Restkit另一鏈路,似乎與發佈的對象,並在響應中接收所述同一對象的事。這是一個與在這個問題中提出的問題不同的問題。

直到v.0.20.x被釋放,這將有望很快,似乎一個平行的類層次是唯一的選擇。如果我不正確,我歡迎在這一點上糾正!

+0

RestKit頻繁更改,找出它支持的最好方法是檢查文檔。但是,在1.0之後它不應該改變太多。現在有一種方法可以使用任何持久性存儲協調器創建RKManagedObjectStore並隨意添加/刪除上下文。 – 2013-06-26 14:27:14

相關問題