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

时间:2015-02-22 19:23:54

标签: ios core-data restkit

我在项目中使用了与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 function包含managedObjectContext属性的声明:

  

要与其关联操作的托管对象上下文。这个   context将用作新操作local的父上下文   NSManagedObjectContext NSPrivateQueueConcurrencyType managedObjectContext   并发类型。成功后,私人环境将被保存   对象映射产生的更改将被“推送”到   给定的背景。

是否有理由为此请求使用另一个MOC而不是主MOC?我只能想象一个案例,当应该使用新的私有上下文时:如果在某个时刻用户是能够通过给定的网络调用删除映射的对象。在这种情况下,将新映射的对象保持在分离的上下文中是合理的,并且仅当用户进行相应的操作时,更改才会传播到主上下文,否则将删除上下文及其所有更改。

就我而言,RestKit用于缓存。在执行请求并且响应已映射之后,CD将调用fetchedRestultsController的委托来更新UI。因此,我总是将mainContext指定为{{1}}属性。

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

1 个答案:

答案 0 :(得分:1)

你的问题实际上并不是关于RestKit或这种方法,而是关于Core Data线程限制。您有责任仅使用指定线程中的托管对象上下文,如果您要求API在上下文中执行某些操作,则您有责任为该线程传递正确的内容。因此,如果您正在制作主线程请求,则应传递主线程上下文。 RestKit将始终创建子上下文,因为它创建了一个后台线程来完成繁重的工作。

虽然不常见,你可以从后台线程开始,然后你需要注意运行循环,回调队列和通知。它可以很快变得复杂,所以通常最好避免......

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