NSFetchedResultsController~cache导致问题?

时间:2010-08-30 07:28:43

标签: iphone objective-c core-data caching nsfetchedresultscontroller

好的,这就是我的设置:

对象模型:

* Category object is at the root  
* Product is linked to a Category (many-to-1)
* ShoppingItem is linked to a Product (many-to-1)

应用程序设置:

我的应用程序在根目录下有一个TabBarController,在每个选项卡的根目录下都有一个tableviewcontroller。

  • 第一个tableviewcontroller显示所有ShoppingItems
    • 它使用NSFetchedResultsController来检索数据
    • 此控制器的sortdescriptor设置为“Product.Category.Name”
    • sectionNameKeyPath设置为“Product.Category.Name”
    • 没有谓词集
    • 为此NSFRC设置缓存名称
    • 这有助于我根据产品类别将购物项目分组。
  • 第二个tableviewcontroller显示所有产品
    • 它也使用NSFRC来检索数据
    • Sortdescriptor - “Category.Name”
    • SectionNameKeyPath - “Category.Name”
    • 谓词集是“Active == 1” - 仅加载活动产品
    • 也为此NSFRC设置了缓存名称
    • 这有助于我根据产品类别对产品进行分组。

情景:

  • 当我通过第三个屏幕更改与产品关联的类别时,显示产品的tableview通过将产品重新绘制到不同(且正确)的部分来适当地刷新本身
  • 但是在显示购物项目的tableview上没有发生同样的事情
  • 我猜测这不是一个问题,因为问题不在于缺少项目,而是在错误的部分插入的项目更多。

当查看对节和行信息的更改时,两个tableview控制器的设置方式与NSFRCDelegate通知的方式相同。

有关这里发生的事情的任何线索?这种行为是否正确?

P.S。 :Am @ work并且无法发布代码片段。可以回家做,如果这会有所帮助。

3 个答案:

答案 0 :(得分:0)

缓存可能会导致临时问题,但如果您对上下文进行更改,则应自动刷新缓存。您可以通过在视图控制器的viewWillAppear方法中删除FRC缓存来测试此问题。这样当你回到视图时,它每次都以新的缓存开始。

我认为您更有可能拥有两个不同的托管对象上下文。您有一个Product表的上下文,另一个由Change-viewShoppingItems表共享。

如果ShoppingItems表和更改视图共享上下文,则更改视图中所做的任何更改都将自动显示在ShoppingItems表中,但更改将不会显示在“购物项目”表中除非您合并上下文的更改。

如果几乎​​必须是单独的上下文,因为ShoppingItems只能通过遍历Product之间的关系来获取其类别名称。如果ShoppingItems显示正确的类别,但Product必须表示每个表正在访问每个Product对象的不同版本。

答案 1 :(得分:0)

奇怪的问题,至少可以说。当使用超过2个级别的部分名称密钥路径时,NSFetchedResultsController是否会收到有关部分更改的通知?

您可以尝试以下解决方法来检查这一点:

将一个名为“categoryName”的只读属性添加到您的ShoppingItem类中,具有以下实现:

- (NSString *)categoryName {
    return self.Product.Category.Name;
}

然后,将以下方法添加到ShoppingItem实现中:

+ (NSSet *)keyPathsForValuesAffectingCategoryName {
   return [NSSet setWithObjects:@"Product.Category.Name", nil];
}

这将确保每次类别名称更改时,KVO系统还将触发categoryName的更改通知,因此希望通知NSFRC更改。当然,使用categoryName作为NSFRC的sectionNameKeyPath。

让我知道这是否有效。

答案 2 :(得分:0)

尝试为不同的配置使用不同的缓存名称(即不同的排序或谓词) - 它应该能够返回正确的数据。它起作用了。