使用没有UITableViewController的NSFetchedResultsController

时间:2010-07-18 21:55:50

标签: iphone cocoa-touch core-data nsfetchedresultscontroller

我在尝试使用没有相应UITableViewController的NSFetchedResultsController时遇到了问题。

根据苹果documentation

“NSFetchedResultsController旨在有效地管理从Core Data获取请求返回的结果,以便为UITableView对象提供数据。”

所以我首先研究了在没有UITableViewController的情况下使用NSFetchedResultsController是否可行并遇到this Stackoverflow post,其中得出的结论是,至少在某些情况下,这不是一个坏主意。

但是现在我遇到了一个问题,当相应的UITableViewController不存在时,NSFetchedResultsController的行为会有所不同。问题是当UITableViewController不存在时,NSFetchedResultsController返回的对象没有IndexPaths。我在stackoverflow post中记录了这个问题。 (注意这是问题的简化,在某些情况下对象确实有IndexPaths,但是我遇到了足够的问题,认为期望没有UITableViewController的IndexPaths是一个坏主意。)

没有IndexPaths,我无法按排序顺序访问返回的对象,也无法访问特定对象。所以我要找的是获取NSFetchedResults控制器以返回具有IndexPaths的对象的方法,或者是访问对象的替代方法。 (或者我可能根本不应该使用NSFetchedResultsController?)

重新替代方法,一种解决方法是将fetchedObjects传递给数组,然后使用该数组。但根据我的经验,创建FRC对象的新指针总会导致问题。我想每当我尝试用自己的指针保留NSManagedObject时,它最终都会导致错误。

仅供参考,我想创建的是一个类似于照片中导航栏的导航栏。如果您想象可以动态地将照片添加到照片应用程序中,那么条形图中的照片将由NSFetchedResultsController管理是有意义的 - 这样添加新照片就会动态添加到条形的末尾,就像如何添加新对象动态添加到UITableView。

感谢您提供帮助我的任何想法!

UPDATE 这个问题(暂时)通过使用 - [NSFetchedResultsController fetchedObjects] objectAtIndex:]

来解决

3 个答案:

答案 0 :(得分:4)

这是通过使用 - [NSFetchedResultsController fetchedObjects] objectAtIndex:]来解决的。

NSFetchedResultsController表现为托管对象的集合,类似于NSArray,使其易于使用。实际上,它公开了一个名为fetchedObjects的只读属性,该属性的类型为NSArray,以便更容易访问它所获取的对象。

答案 1 :(得分:3)

使用-[NSFetchedResultsController fetchedObjects]时有什么问题吗?当你说你遇到问题创造新的指针并保留它们时,我不太清楚你的意思 - 你能解释一下吗?您通常不应该保留NSManagedObject(它们根据需要被取出和出现故障),这可能是问题所在。

答案 2 :(得分:1)

  

(注意这是简化   问题,在某些情况下   对象确实有IndexPaths,但我已经   遇到了足够的问题要相信   期待没有的IndexPaths   UITableViewController是一个坏主意。)

UITableView和NSFetchedResultsController都使用NSIndexPath的NSIndexPath UIKit Additions扩展。该扩展类生成具有显式section和row属性的indexPaths。应使用以下方法手动创建这些路径:

+[NSIndexPath indexPathForRow:inSection:]

如果使用其他方法创建indexPath,则接收方必须推断section和row属性。他们通常会正确地推断,但错误的可能性仍然存在。