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

时间:2013-06-20 10:35:18

标签: core-data restkit restkit-0.20

我将RestKit 0.20.2与MagicalRecord结合使用(对于您能想到的任何最终背景问题非常重要)。

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

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

[RKObjectManager sharedManager].operationQueue.maxConcurrentOperationCount = 3;

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

解决方案也正如预期的那样工作。但是又有一个问题,因为每个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并且......它&#39 ; s我失去了希望并转向stackoverflow;)

1 个答案:

答案 0 :(得分:0)

通常情况下,我在SO上发布后找到了解决方案:)

问题是RKManagedObjectRequestOperations 所有创建之前 restkit实际发送了信息。因此,对于所有请求,上​​下文都是相同的(如properObjectRequestOperationWithObject方法中所述,并且由于上下文引用是“旧”引用,因此未传播更改。

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