使用RestKit 0.20.3。在获取的结果控制器的didChangeObject:(id) … forChangeType
方法中放置post / put / delete(创建/更新/删除)调用无效。
在从数据库中获取最近的条目时,获取的结果控制器(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 :(得分:1)
我假设服务器为新对象分配唯一标识符,因此当您在本地创建对象时,它不会有一个开始。
FRC旨在更新表格视图。因此,当您进行提取时,您将获得许多对象,这些对象在之前但现在不在FRC数据集中。你的代码将它误解为新对象,而实际上它并非(大部分时间)。
您应该检查是否设置了唯一标识符,并且只检查了新对象。从技术上讲,如果您将唯一ID发送到服务器,那么无论如何都不应该获得重复项,因为它可以识别欺骗。
对于更新,您应该考虑在您的实体中添加changed
标志,只要上传任何应该上传的属性并在上传成功后重置,就会设置该标志。用它来过滤PUT。