目标:使用FRC,按Section's属性(startDate)对NSDate进行排序,但希望Today的日期Section出现在Upcoming日期Section之前。

我使用瞬态属性sectionIdentifier遵循了Apple的代码。 Apple's sample code .,并首先从该项目开始:OneFRC

我很快意识到,仅使用一个FRC可能无法做到这一点(我可能错了)。

接下来,我决定对这三个FRC进行尝试:ThreeFRC

TableView sections现在出现在我想要的顺序中:

第0节:Today

第1节:Upcoming

第2节:Past

但是,添加数据会触发FRC委托,并且出现以下错误:

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 (4) must be
equal to the number of rows contained in that section before the update (3), plus
or minus the number of rows inserted or deleted from that section (0 inserted,
0 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)


同样,我很希望能够用1个FRC来实现我的目标,但我似乎还不知道该怎么做。

我已经尝试解决此问题已有4天了!如果不能通过SO解决此问题,我想我可以联系Apple寻求开发人员支持。如果我这样做,我会将决议发布在这里,以便其他人可以从中受益。

在Github上可以使用以下项目:

One FRC

Three FRC

编辑

感谢@blazejmar,我能够摆脱rows错误。但是,现在尝试添加sections时出现错误。

2014-11-03 16:39:46.852 FRC[64305:60b] CoreData: error: Serious application error.
An exception was caught from the delegate of NSFetchedResultsController during a
call to -controllerDidChangeContent:.  Invalid update: invalid number of sections.
The number of sections contained in the table view after the update (2) must be
equal to the number of sections contained in the table view before the update (1),
plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).
with userInfo (null)


重现三个FRC中的错误的步骤:

1. Launch App ->
2. Tap Generate Data ->
3. Tap View in FRC ->
4. Tap back to the RootVC ->
5. Change the system date to a month from Today ->
6. Tap View in FRC and only one section `Past` should appear. ->
7. Tap `Add Data`.
8. The error should appear in the log.

最佳答案

在ThreeFRC项目中,存在一些问题:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
    self.numberOfSectionsInTV = 0;
    [self fetchData];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView reloadData];
    [self.tableView endUpdates];
}


您不应在FRC委托中使用fetchData。方法以正确的顺序(在更新之前,期间和之后)被调用,因此在回调内部您具有一致的上下文状态。同样,在endUpdates之前使用reloadData并不是最好的主意(它会应用您之前提供的所有更改),而reloadData会擦除所有内容并从头开始构建它。这很可能导致崩溃。

我发现的另一件事可能是越野车,是处理更新。如果您有3个没有节的独立FRC,则不会在FRC委托中获得节更新回调。但是,如果某些对象出现在FRC之一中,则应检测到该情况并手动将其插入。

仅在controllerDidChangeContent中使用reloadData就足够了,但这不是最佳解决方案,因为您不会获得任何动画。正确的方法是处理所有情况:从一个FRC中删除所有对象(然后从TableView中手动删除节),将第一个对象插入FRC中(然后您应在适当的indexPath处创建新节)。

关于ios - NSFetchedResultsController:多个FRC,更新时出现委托(delegate)错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24556123/

10-13 04:02