我正在使用主/细节机制。 tableview控制器使用[controller:(NSFetchedResultsController *)controller didChangeObject:...]来刷新相关行。 它适用于插入和删除。
现在我不想真正删除行,juste"隐藏"它们。
所以我添加了一个布尔'删除'在我的核心数据模型中,我的主人使用谓词来获取" deleted = FALSE"。
在[controller:(NSFetchedResultsController *)控制器didChangeObject:...]中我需要:
以下是代码:
case NSFetchedResultsChangeUpdate:
// This is fired by saving managedObject.deleted from FALSE to TRUE
// ... so I would like to delete the corresponding row from the tableview
// without reloading the full table.
self.fetchedResultsController = nil;
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
但它没有按预期工作,并且juste崩溃并显示错误消息:
2012-05-31 09:48:23.293 TableViewTest[32701:fb03] CoreData: error:
``Serious application error.
An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.
Invalid update: invalid number of rows in section 0.
The number of rows contained in an existing section after the update (7)
must be equal to the number of rows contained in that section before the update (7),
plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted)
and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).
with userInfo (null)
消息很明确,NSFetchedResultsController不会返回正确的计数。通过启用CoreData请求日志,似乎在此方法中,尚未提交更改。
我尝试了不同的方法:
但我总是遇到同样的问题。 为什么它适用于插入和真正的删除(插入和删除不是提交但是由NSFetchedResultsController看到)。
PS:为了说明这个特殊问题,我从Xcode模板创建了一个新项目(使用CoreData + MasterController选项)。你可以在github上找到它https://github.com/arnauddelattre/TableViewTest。您可以尝试添加一些行,然后选择一行并单击"逻辑删除"。
_
编辑:关注Mundi回复 Mundi建议我在托管上下文中调用save方法。 如您所见,我已经在save方法中,它调用[controller didChangeObject]。 因此,它导致在保存中调用保存。
对我来说奇怪的是,似乎正在运作。但是我害怕可能的副作用(因为在保存中调用save)。它是一个"标准"实现我想要的方式?
我仍然不明白为什么这种行为与插入/删除不同。
答案 0 :(得分:1)
您可以在将NSFetchedResultsChangeUpdate
设置为fetchedResultsController
之前保存(提交)nil
回调中的更改。