哪个是 RestKit 的 managedObjectRequestOperationWithRequest: 服务的正确 MOC 参数

Which is the right MOC parameter for RestKit's managedObjectRequestOperationWithRequest: service

我在我的项目中使用了与 CoreData 集成的 RestKit。要执行网络请求并映射其 JSON 响应,项目中广泛使用以下服务:

- (RKManagedObjectRequestOperation *)managedObjectRequestOperationWithRequest:(NSURLRequest *)request
                                                          managedObjectContext:(NSManagedObjectContext *)managedObjectContext
                                                                      success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success
                                                                      failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure

documentation of this functionmanagedObjectContext 属性有这样的声明:

The managed object context with which to associate the operation. This context will be used as the parent context of a new operation local NSManagedObjectContext with the NSPrivateQueueConcurrencyType concurrency type. Upon success, the private context will be saved and changes resulting from the object mapping will be 'pushed' to the given context.

是否有任何理由为此请求使用另一个 MOC 而不是主 MOC? 我只能想象一种情况,当应该使用新的私有上下文时:如果在在某些时候,用户可以通过给定的网络调用删除映射的对象。在这种情况下,将新映射的对象保存在单独的上下文中可能是合理的,只有当用户执行相应操作时,更改才会传播到主上下文,否则上下文将连同其所有更改一起被删除。

在我的例子中,RestKit 用于缓存。在执行请求并映射响应后,CD 将调用 fetchedResultsController 的委托来更新 UI。因此,我总是将 mainContext 指定为 managedObjectContext 属性。

在我发现的某处示例项目中,该属性指定给被调用线程的 MOC。如果它是主线程,那么主上下文将是输入,如果它是从后台线程启动的,那么将为请求创建一个新的子 MOC。但是我觉得,不太合理吧?

您的问题并不是关于 RestKit 或此方法本身,而是关于 Core Data 线程限制。您有责任仅使用来自指定线程的托管对象上下文,如果您要求 API 在上下文中做某事,您有责任为线程传递正确的上下文。因此,如果您正在发出主线程请求,您应该传递主线程上下文。 RestKit 将始终创建一个子上下文,因为它会创建一个后台线程来完成繁重的工作。

虽然不常见,但您可能会从后台线程开始,然后您需要注意 运行 循环、回调队列和通知。它会很快变得复杂,因此通常最好避免这种情况...

通常使用对象管理器比直接使用操作更容易,因为它会为您处理这些选择。你也几乎总是从主线程开始,让 RestKit 为你处理后台下载和映射,然后将结果推回主线程。