我将 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;)