RestKit 两个连续的 enqueueBatchOfObjectRequestOperations 没有直接映射到核心数据

Posted

技术标签:

【中文标题】RestKit 两个连续的 enqueueBatchOfObjectRequestOperations 没有直接映射到核心数据【英文标题】:RestKit two consecutive enqueueBatchOfObjectRequestOperations not directly mapped to core data 【发布时间】:2013-06-20 10:35:17 【问题描述】:

我将 RestKit 0.20.2 与 MagicalRecord 结合使用(对于您能想到的任何最终上下文问题都很重要)。

我的应用程序是一个带有项目(实体)的储蓄票(实体),每个项目都有一个税(实体)。我的用例是这样的:当ipad在很长一段时间无法发送数据(无论出于何种原因)后重新连接到互联网时,我需要将核心数据与我的网络服务器同步

我的问题是能够同步很多对象(它可以从 100 到 1000 甚至更多),能够在没有超时的情况下发布很多对象我设置了 restkit 并发:

[RKObjectManager sharedManager].operationQueue.maxConcurrentOperationCount = 3;

现在一切正常。但我的问题是我有很多与每个项目同步的冗余实体。 例如,每个项目都有税,但我的模型中只有两个税需要与 Web 服务同步,然后作为与项目的关系发送(我只输入税的 ID)。因此,为了规避每个 postItem 的问题,我检查相关的税是否有 ID,如果是,那么我可以直接解析项目与其中的税关系,如果没有,我需要先同步税,然后将项目与退税号。

解决方法也按预期工作。但是又出现了一个问题,因为在每个 postItem 之间,RestKit 不会在两个请求之间保存新的 TaxID,所以它不是发送一次,而是每次在一个项目中遇到它时发送它,并且当所有操作完成后它会保存新创建的 taxID

为了改善这一点,我在restkit中挖掘了一下,发现

- (void)enqueueBatchOfObjectRequestOperations:(NSArray *)operations
                                 progress:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progress
                               completion:(void (^)(NSArray *operations))completion

所以现在我正在为我的税务实体构建 RKManagedObjectRequestOperations 并对其进行批处理。 然后我同步项目。它更高效,而且我不需要在操作之间设置依赖关系(因为我需要它们按特定顺序执行,然后对项目征税,然后是整张票。)

问题在两个 enqueueBatchOperations 之间,RestKit 不会立即映射第一批的结果,即使我明确调用

[[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext saveToPersistentStore:&error]

它没有被映射,因为在第一批税之后,我发送了所有项目,我可以看到 taxID 没有设置,但是在所有批次完成后,我可以清楚地看到它们正确映射我的核心数据文件。所以我认为这是一个上下文问题,但是当我深入研究 RestKit 时,更具体地说是在

appropriateObjectRequestOperationWithObject:(id)object
                                           method:(RKRequestMethod)method
                                             path:(NSString *)path
                                       parameters:(NSDictionary *)parameters

我可以看到第 580 行:

NSManagedObjectContext *managedObjectContext = [object respondsToSelector:@selector(managedObjectContext)] ? [object managedObjectContext] : self.managedObjectStore.mainQueueManagedObjectContext;

这为操作设置了 mainQueueContext(而不是对象上下文)(我已经用断点检查过),因此调用 save 或 saveToPersistentStore 应该将更改从子上下文传播到 mainQueue 并且...这是我的位置失去希望并转向***;)

【问题讨论】:

【参考方案1】:

正如通常发生的那样,我在 SO 上发布后找到了解决方案 :)

问题在于 all 创建的 RKManagedObjectRequestOperations before restkit 实际上发送了信息。所以所有请求的上下文都是相同的(正如在适当的ObjectRequestOperationWithObject 方法中提到的那样,并且由于上下文引用是“旧”引用而没有传播更改。

要获得有关下一个请求的信息,我只需在 enqueueBatchOfOperations 完成块中构建 RKManagedObjectRequestOperations,现在一切都可以使用新创建的 taxID 正常工作;)

【讨论】:

以上是关于RestKit 两个连续的 enqueueBatchOfObjectRequestOperations 没有直接映射到核心数据的主要内容,如果未能解决你的问题,请参考以下文章

RestKit:两个独立的提要,两种不同的对象类型。一个对象管理器?

使用 RestKit 同时调用两个 web 服务

Restkit 对象映射两个类错误访问

使用 RestKit 0.2x 创建两个独立的持久存储

RestKit 对象映射 - 一个实体,两个映射

Magical Record 做了哪些 RESTKit 没有做的事情?我会需要这两个框架吗?