2014-04-02 11 views
0

使用RestKit 0.20.3。在抓取的结果控制器的didChangeObject:(id) … forChangeType方法中放置post/put/delete(创建/更新/删除)调用没有解决。RestKit 0.20.x如何从表格视图发布/放置/删除(创建/更新/删除)

从数据库获取最新条目时,获取结果控制器(FRC)获取新插入的检索记录的插入通知。这会导致重复该对象的POST。该帖子本身导致两个POSTS和五个PUTS。第一个POST是RestKit(RK)检索和ID。第二个是导致POST的POST。 PUTS来自两个帖子的更新,每个帖子都会在FRC中生成更改通知。这样做的主要后果是每次刷新都会增加2次幂的记录重复。

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { switch (type) { case NSFetchedResultsChangeInsert: [self.timeEntryTableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; // call to RK enqueue a POST with the object via RKObjectManager break; case NSFetchedResultsChangeDelete: [self.timeEntryTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];//// // call to RK enqueue a DELETE with the object via RKObjectManager break; case NSFetchedResultsChangeUpdate: [self.timeEntryTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; // call to RK enqueue a PUT with the object via RKObjectManager break; … } }

的问题是,什么是正确的方法是什么?我相信答案涉及核心数据关系和节约。我正在努力。不知道这会导致什么。指针欢迎。

当前回答RestKit - Send added/edited/deleted objects after offline storage会帮助我。

+0

你怎么定义'不必要'? FRC将收到有关更改的通知,但不一定会进行综合更改。这也取决于你如何保存MOC关于如何发布通知... – Wain

+0

你的评论让我质疑,这种方法可能实际上是正确的,我可能已经犯了一些其他错误。我创建了一个较小的测试应用程序来验证不良行为,并验证了我的怀疑,认为这不是正确的方法。你会发现修改后的问题可以更清楚地描述不良行为。是的,我认为正确的做法可能与保存托管对象上下文有关。 –

回答

1

我假设服务器为新对象分配唯一标识符,因此当您在本地创建对象时,它没有一个开始。

FRC旨在更新表格视图。所以,当你进行一次抓取时,你会得到一些不属于FRC数据集但是现在已经存在的对象的插入。当你的代码真的不是(大部分时间)时,你的代码就会误解为新对象。

您应该检查是否设置了唯一标识符,并且仅在不是时发布新对象。从技术上讲,如果您将唯一ID发送到服务器,则无论如何您都不应该得到重复,因为它可以识别这个重复。

对于更新,您应该考虑为您的实体添加一个changed标志,该标志在上传成功后需要上传的任何属性被修改并重置时设置。用它来过滤PUT。

+0

我已经投了答案,因为它的工作原理,并添加插入案例POST的示例代码。您可以在[RKJets](https://github.com/telegraphy-interactive/RKJets)上找到完整的示例应用程序。答案和应用程序对我来说并不完全令人满意,因为我期望RestKit为我做这种簿记,根据观察对象的变化提出请求,并以一种或多或少的自以为是的方式进行RESTful调用。如果是这样,那么这个答案和参考样本是错误的。因此,我没有将答案标记为已接受。谢谢! –

+0

RestKit没有这种自动功能(目前)。在0.1x版本中有一个分支,有人正在为它工作,但它从来没有达到0.2x。一般来说解决这个问题并不是一个小问题,但是您可能希望在RestKit的google小组上讨论它,或者引发一个github问题。 – Wain

+0

根据您的说法,我已将此答案标记为已接受的答案。感谢您的答复。 –