gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:16:45 27 4
gpt4 key购买 nike

我在项目中使用了与 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 属性有这样的语句:

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? 我只能想象一种情况,即应使用新的私有(private)上下文:如果在某个时刻用户能够通过给定的网络调用删除映射的对象。在这种情况下,将新映射的对象保留在单独的上下文中可能是合理的,并且仅当用户执行相应的操作时,更改才会传播到主上下文,否则上下文将连同其所有更改一起被删除。

就我而言,RestKit 用于缓存。执行请求并映射响应后,CD 将调用 fetchedResultsController 的委托(delegate)来更新 UI。因此,我总是将 mainContext 指定为 ManagedObjectContext 属性。

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

最佳答案

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

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

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

关于ios - 哪个是 RestKit 的 managedObjectRequestOperationWithRequest : service 的正确 MOC 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28662205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com