【发布时间】: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 并且...这是我的位置失去希望并转向stackoverflow;)
【问题讨论】:
标签: core-data restkit restkit-0.20