0

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

4

1 回答 1

0

正如它通常发生的那样,我在 SO 上发布后找到了解决方案:)

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

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

于 2013-06-20T13:04:15.123 回答