1

我有每个都有一个类别的项目。我使用 aNSFetchedResultsController来显示项目并按类别名称将它们分组到部分中。

self.fetchedResultsController = [Item MR_fetchAllSortedBy:@"category.categoryName" ascending:YES withPredicate:nil groupBy:@"category.categoryName" delegate:self];

但是当我如下添加两个新项目时,只有一个具有类别的项目被插入到列表中。如果我重新启动应用程序,没有类别名称的应用程序会显示在顶部,没有部分,就像它应该的那样。

这就是我插入的方式(使用 Magical Record):

Category *category = [Category MR_createEntity];
category.categoryName = @"My Category";

Item *itemWithCategory = [Item MR_createEntity];
itemWithCategory.itemName = @"Item with category";
itemWithCategory.category = category;

Item *itemWithoutCategory = [Item MR_createEntity];
itemWithoutCategory.itemName = @"Item without category";

[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait];

为什么在引用子对象的属性并且该子对象为 nilNSFetchedResultsController时添加新项目时不会收到通知?sectionNameKeyPath

4

1 回答 1

0

尝试使用 nil 部分值对 fetchedResultsController 结果进行分区时,我的运气非常糟糕。文档没有提到,但我认为它实际上是不允许的。

从文档中也不清楚,但是:您用于分段的属性实际上不必是建模属性,并且可以是合成的。(例如,当使用日期作为部分时,这可能非常方便。)

因此,我通常的解决方法是创建一个合成的只读属性,Item.formattedCategoryTitle例如,Item.category.categoryName如果不是 nil 则返回,否则返回适当的占位符。也许会慢一点——我认为如果 section 属性在数据库中,Core Data 会利用——但它可以工作。


(PS 另一个小问题:文档声称“影响结果集或部分信息的上下文中的任何更改都将得到处理,并相应地更新结果。”这并非严格意义上的正确:只注意到对获取的实体的更改。

在这种情况下,如果Category对象本身发生变化(例如,分配了新标题),fetchedResultsController 将不会注意到。在这种情况下,它只注意到Item对象的变化——它们本身必须改变,控制器才能重新评估它们的存在、顺序、分区等。

如果这可能发生,您可以: 设置第二个 fetchedResultsController 只是为了观察类别的变化,并触发主控制器的重新获取;或在那里注册 NSManagedObjectContextObjectsDidChangeNotification并检测类别变化;或编写Category以便它“弄脏”它的项目,如果它发生变化,例如,通过对它们进行空更改。我已经尝试过这些方法,并且愿意听到更好的方法!)

于 2013-05-26T18:59:48.813 回答