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 没有直接映射到核心数据的主要内容,如果未能解决你的问题,请参考以下文章