RestKit - 混合实体映射和对象映射



我在我的iOS应用程序中使用RestKit,到目前为止,我只是使用对象映射,因为我没有将任何数据保存到CoreData。我现在想为用户添加下载一些数据的可能性,并在用户没有互联网连接时使用该数据。

我知道我必须为此使用实体映射,但我遇到了一个问题:如何对同一个请求使用两个不同的映射?我的意思是,我不明白我应该如何处理这两个案例。无论用户决定下载数据还是只是请求显示一次,URL 路径都将完全相同。我怎样才能告诉 RestKit 一次将其存储在 CoreData 中,而另一次简单地使用 ObjectMap 映射它?

基本上,我问的问题与此相同:如何在不保存核心数据模型的情况下使用它们?但专门用于RestKit而不是MagicalRecords。

我刚刚遇到了类似的问题:除了映射到核心数据的用户对象之外,我还需要获取一个返回的令牌。令牌是在 JSON 响应中自行发送的,所以我不确定如何提取它。

最后我使用了以下内容:

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

JSON 的格式为:

{
    “token”: “....”,
    “user”: {
        ....
    }
}

操作 setWillMapDeserializedResponseBlock 方法使您有机会在映射发生之前操作结果 - 或者获取对象映射未涵盖的其他数据。效果很好。

处理这种情况的正确方法是使用不同的 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;

最后,完成此操作后,应在某处存储对临时上下文的引用,并根据应用的上下文决定使用哪个上下文。

最新更新