总结:我有两个不同的视图,它们使用表来显示获取结果控制器的结果。这些表可能包含相同的数据。在加载另一个表后移动一个表中的行时出错。 (显然我想!)
为了简化,想象一个由国家组成的实体,以及将这些国家组合成一组国家的另一个实体。我们有一个“editSet”视图,允许您使用标准UI命名集合,添加或删除集合中的国家/地区以及重新排序它们。然后我们有一个“viewSet”视图,向您显示这些国家和与之相关的一些价值(例如汇率或其他)。
现在,在编辑视图中,当我们重新排序并调用moveRowAtIndexPath时,我设置了一个BOOL,它会停止任何进一步的UI更改,直到更新coredata(每个记录都有一个displayOrder整数,我在执行另一个performSearch之前更新)。如果你只是实例化了“editSet”视图,这一切都很有效。
如果出现问题,则加载“viewSet”然后使用相同的set加载“editSet”并移动行。我们在editSet中设置的BOOL不会传递给viewSet(也就是“观察”coredata),并且当以编程方式更改coredata时会感到不安。这会产生:
Serious application error. An exception was caught from the delegate of
NSFetchedResultsController during a call to -controllerDidChangeContent:
. *** -[NSMutableArray removeObjectAtIndex:]:
index 0 beyond bounds for empty array with userInfo (null)
所有的一切都会失败。
另一方面,如果我使用A DIFFERENT SET加载/显示“viewSet”到我正在编辑的那个,没有问题。
所以,我需要做的是在离开viewSet时“断开”FRC和表(可能在没有搜索任何内容并重新加载表?)或者在coredata中保存移动的行时将BOOL传递给viewSetController在editSet中模仿我在该viewcontroller中本地做的事情(不太确定如何做到这一点,但我猜是可行的。)
我确信我不是第一个遇到这个问题的人,所以想知道,最好的方法是什么?
答案 0 :(得分:0)
为“编辑”使用另一个托管对象上下文,然后在返回“viewSet”时将它们合并回来。看一下Apple示例代码项目'CoreDataBooks',看看如何使用两个上下文来执行不相交的编辑。