Core data RestKit未直接映射到核心数据的两个连续enqueueBatchOfObjectRequestOperations

Core data RestKit未直接映射到核心数据的两个连续enqueueBatchOfObjectRequestOperations,core-data,restkit,restkit-0.20,Core Data,Restkit,Restkit 0.20,我将RESTKit0.20.2与MagicalRecord结合使用(对于您可能想到的任何最终的上下文问题都很重要) 我的应用程序是一个保存票据(实体)的项目(实体),每个项目有一个税(实体)。我的使用案例是这样的:当ipad在长时间无法发送数据(无论出于何种原因)后重新连接到互联网时,我需要将核心数据与我的Web服务器同步 我的问题是能够同步很多对象(可以从100到1000甚至更多),能够发布很多对象而不超时我设置了restkit并发: [RKObjectManager sharedManage

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

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

我的问题是能够同步很多对象(可以从100到1000甚至更多),能够发布很多对象而不超时我设置了restkit并发:

[RKObjectManager sharedManager].operationQueue.maxConcurrentOperationCount = 3;
现在这一切都很好。但我的问题是,我有很多冗余实体与每个项目同步。 例如,每个项目都有一个税,但我的模型中只有两个税需要与web服务同步,然后作为与项目的关系发送(我只输入税的id)。因此,为了避免每个帖子出现这个问题,我会检查相关税项是否有ID,如果有,那么我可以直接解析其中的税项关系,如果没有,我需要先同步税项,然后将税项与返回的税项进行同步

这项工作也在按预期进行。但同样存在一个问题,因为在每个positem之间,RestKit不会在两个请求之间保存新的TaxID,因此它不会发送一次,而是在每次遇到项目内部的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,并。。。在这里,我失去了希望,转而求助于stackoverflow;)

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

问题在于,RKManagedObjectRequestOperations在restkit之前创建了,其中all实际上发送了信息。因此,所有请求的上下文都是相同的(正如在适当的ObjectRequestOperationWithObject方法中提到的,并且更改不会传播,因为上下文引用是“旧”引用

为了获得下一个请求的信息,我只需在enqueueBatchOfOperations完成块中构建RKManagedObjectRequestOperations,现在新创建的taxID可以正常工作;)