2

我有一个从 NSFetchedResultsController 获取数据的表格视图。它根据 NSDate 属性将数据组织成部分。在每个部分中,数据也由 NSDate 属性组织。

有时,我必须调用网络服务来检索一些数据来更新我的列表。该数据可以是现有数据的插入或更新。

这是我的问题:当核心数据结束数据记录时,我的 NSFetchedResultsController 要求它的委托移动一些行......但这些行应该已经更新,而不是移动。

这些行对应于我刚刚更新的一些实体。但是更新永远不会发生在我用来排序数据的属性上。这些行不应该移动!事实上,这个错误不会发生在我更新的每个实体上,而只是其中一些。他们总是一样的,但他们没有什么特别的,他们和其他人一样......

我在 Apple 的文档中阅读了一篇关于移动对象的文章,这些对象有时报告为已更新,但不幸的是,这不是我的问题。

从创建 NSFetchedResultsController(及其请求、谓词和 sortDescriptors)、处理 NSFetchedResultsController 通知的更改、注册数据等开始,那里有很多代码。告诉你想要什么,我会张贴的。

提前谢谢你们!

4

1 回答 1

0

只是猜测,您可能对更新和 Web 服务使用相同的上下文。如果是,您应该至少有两个上下文,一个用于控制器,一个用于更新。

然后,您可以合并两者,暂时将获取的控制器从委托中退出。并在更新完成后重新分配,然后重新发出 fetch。您避免了许多可能会在一段时间内冻结您的 UI 的单元格移动。

此外,NSFetchedResultsController 不仅会在保存上下文时做出反应,还会在创建新实体但未保存时做出反应。

这是通过调用:

NSManagedObject *mo = [[NSManagedObject alloc] initWithEntity:myEntityDesc insertIntoManagedObjectContext:ctx];

一个新的单元格在 tableview 中占据了它的位置,所有其他单元格都被移动了。

如果调用了“移动”,听起来您的 UIViewController 仍然是您获取的控制器的委托。

通常的方法,至少对我来说或从我所看到的情况来看,是让控制器重新发出 fetch,然后在你的表视图上调用 reloadData。

否则,请记住,即使您更改了关系,您的控制器也会对这些更改做出反应。

要调试,您可以将 UIViewController 注册为 NSManagedObjectContextObjectsDidChangeNotification NSManagedObjectContextObjectsDidSaveNotification 的观察者,放置断点并查看触发错误移动的属性。

于 2013-01-29T09:59:30.640 回答