我有一个tableview,它从NSFetchedResultsController获取数据。它根据NSDate属性将数据组织到部分中。在每个部分中,数据也由NSDate属性组织。
有时,我必须调用web服务才能检索一些数据来更新我的列表。此数据可以是现有数据的插入或更新。
这是我的问题:当Core Data结束数据记录时,我的NSFetchedResultsController要求其委托移动一些行......但这些行应该已经更新,而不是移动。
这些行对应于我刚更新的一些实体。但是更新永远不会出现在我用来订购数据的属性上。这些行不应该移动!事实上,我更新的每个实体都不会发生这个错误,但只有其中一些实体。他们总是一样,但他们没有什么特别的,他们就像其他人一样......
我在Apple的文档中读到了一篇关于移动对象的文章,其中有时会报告为已更新但不幸的是,这不是我的问题。
NSFetchedResultsController(带有request,predicate和sortDescriptors)的创建,NSFetchedResultsController通知的更改的处理,数据的注册等等都有很多代码。告诉你哪一块想要,我会发布它。
先谢谢你们!
答案 0 :(得分:0)
只是猜测,您可能正在使用相同的上下文进行更新和Web服务。 如果是,您应该至少有两个上下文,一个用于控制器,另一个用于更新。
然后你可以合并这两个,暂时将获取的控制器从委托中撤销。并在更新完成后重新分配,然后重新发出提取。你可以避免许多细胞移动,这可能会暂时冻结你的UI。
此外,NSFetchedResultsController不仅会对保存上下文做出反应,而且还会在创建新实体但未保存时做出反应。
通过调用:
NSManagedObject *mo = [[NSManagedObject alloc] initWithEntity:myEntityDesc insertIntoManagedObjectContext:ctx];
新的单元格取代tableview,所有其他单元格都被移动。
如果调用'move',听起来你的UIViewController仍然是你提取的控制器的委托。
通常的方式,至少对我来说或者从我看到的情况来看,让控制器重新发出fetch,然后在表视图上调用reloadData。
否则,请记住,即使您更改了关系,您的控制器也会对这些更改做出反应。
要进行调试,您可以将UIViewController注册为NSManagedObjectContextObjectsDidChangeNotification NSManagedObjectContextObjectsDidSaveNotification的观察者,设置断点并查看触发错误移动的属性。