2017-05-14 229 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方法让你操纵的结果映射发生之前的机会 - 或者抓取您的对象映射未涉及的其他数据。很好地工作。