2017-05-14 230 views
0

我在我的iOS應用程序中使用RestKit,直到現在我只是使用對象映射,因爲我沒有將任何數據保存到CoreData。我現在想增加用戶下載一些數據的可能性,並且如果用戶沒有互聯網連接,則使用該數據。RestKit - 混合實體映射和對象映射

我知道我必須使用實體映射,但我遇到了一個問題:如何爲同一個請求使用兩個不同的映射?我的意思是,我不明白我應該如何處理這兩種情況。無論用戶決定下載數據還是隻是要求它顯示一次,URL路徑都將完全相同。我如何告訴RestKit一次將其存儲在CoreData中,另一次只需將它映射到ObjectMapping?

基本上,我問這個問題相同的問題:How to use Core Data models without saving them? 但專門爲RestKit而不是MagicalRecords。

回答

0

處理這種情況的正確方法是使用不同的ManagedObjectContexts。 您將需要一個持久性數據,並可以設置是這樣的:

// Initialize managed object store 
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; 
objectManager.managedObjectStore = managedObjectStore; 
[managedObjectStore createPersistentStoreCoordinator]; 
[[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 

然後,您可以創建第二個方面,這將是暫時的唯一:

NSManagedObjectContext *newTemporaryContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; // Choose your concurrency type, or leave it off entirely 
[newTemporaryContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 
newTemporaryContext.persistentStoreCoordinator = coordinator; 

最後,一旦完成,應該在某處存儲對臨時上下文的引用,並根據應用的上下文決定要使用的上下文。

0

我剛剛有一個類似的問題:除了我映射到Core Data的用戶對象外,我還需要獲取返回的令牌。令牌在JSON響應中自己發送,所以我不知道如何提取它。

最後,我用下面的:

[operation setWillMapDeserializedResponseBlock:^id(id deserializedResponseBody) { 
    NSDictionary *dictionary  = [[NSMutableDictionary alloc] init]; 
    dictionary = deserializedResponseBody; 
    self.token = [dictionary objectForKey:@"token"]; 
    return deserializedResponseBody; 
}]; 

的JSON格式爲:

{ 
    「token」: 「....」, 
    「user」: { 
     .... 
    } 
} 

操作setWillMapDeserializedResponseBlock方法讓你操縱的結果映射發生之前的機會 - 或者抓取您的對象映射未涉及的其他數據。很好地工作。