【问题标题】:NSFetchedResultsController's sectioninfo seems to persist even with FRC set to nil?即使 FRC 设置为 nil,NSFetchedResultsController 的 sectioninfo 似乎仍然存在?
【发布时间】:2014-06-05 15:11:02
【问题描述】:

我有一个带有分段控件的头视图(视图 A)。段 0 加载 FRC,并从非瞬态属性设置 sectionnamekeypath 并对其进行排序。

Segment 1 加载 FRC,从瞬态属性设置 sectionNameKeyPath(在 Apple 的示例中几乎是月份和年份),并在相同的非瞬态属性段 0 上进行排序。

当点击 Segment 0 的 FRC 的一个单元格时,它会推送到视图 B,这里一个新的 FRC 使用谓词加载特定于选择的对象。它从第二个瞬态属性设置其 sectionNameKeyPath,并根据其他 2 个相同的非瞬态属性进行排序。

会发生以下情况:

  1. 查看 A:

    多次在段 0 和 1 之间切换。 FRC 会加载它们应该加载的内容。

    在段 0 中选择一个单元格 --> 这会正确推送视图 B

  2. 视图 B:

    FRC 按预期加载。

    按下后退按钮 --> 视图正确地返回到视图 A。

  3. 查看 A:

    段 0 及其 FRC 已正确加载并显示

    Select segment 1: Error:
    
    "has an out of order section name **segment name from View B's section**"
    

我觉得很奇怪,它给出的错误包含前一个视图中 FRC 的部分名称。当视图 WillDisAppear 时,我将 FRC 及其委托设置为 nil。

当我对瞬态属性进行断点时,我可以看到它只请求段 1 的 FRC,所以它仍然可以看到视图 B 的部分似乎没有意义?

【问题讨论】:

    标签: ios objective-c uitableview core-data nsfetchedresultscontroller


    【解决方案1】:

    问题可能是因为您对两个 NSFetchedResultsController 实例使用相同的缓存。创建实例时传递不同的缓存名称,

    _fetchController = [[KREFetchedResultController alloc] initWithFetchRequest:request
                                                           managedObjectContext:context
                                                             sectionNameKeyPath:@"sectionKey"
                                                                      cacheName:@"mycache"];
    

    你也可以在不需要的时候删除缓存,调用NSFetchedResultsController的类方法deleteCacheWithName:删除包含缓存部分信息的特定缓存,

    /* Deletes the cached section information with the given name.
        If name is nil, then all caches are deleted.
    */
    + (void)deleteCacheWithName:(NSString *)name;
    

    或通过nil 删除所有缓存。

    如果您不希望缓存,则在创建获取结果控制器时将缓存名称传递为 nil

    希望有帮助!

    【讨论】:

    • 感谢 Amar,但我已经拥有了所有三个 FRC,其缓存为 nil,因为它有时会起作用。奇怪的是,我尝试设置 View B 的缓存,它只崩溃了一次,之后它又可以工作了。 (除了缓存的当然不更新)也许我应该给他们一个缓存并在每次推送新视图时删除它?或以某种方式将 FRC 保留到仅该视图..
    • 如果我将 FRC 1 的 sectionNameKeyPath 更改为与视图 B 的 FRC 相同的瞬态属性,则不会发生此崩溃。所以这些部分似乎出了问题,因为这些 FRC 从同一实体获取数据但具有不同的部分?我在传递给视图时将所有内容都设置为 nil,所以我不明白为什么一个仍然可以阻碍另一个:/
    【解决方案2】:
    • 列表项

    我想我解决了。几乎每一行代码都设置了断点,但这让我无处可去。单独缓存也没解决。

    我在 prepareforsegue 方法的最后几行中将我的控制器及其委托设置为 nil。我将该代码移动到特定 segue 的 if 方法中

    if ([[segue identifier] isEqualToString:@"segueID"]) {
    
    //set destination VC's properties first since they might come from the FRC.
    
     _fetchedResultsController.delegate = nil;
     _fetchedResultsController = nil;
    }
    

    它突然起作用了.. 很奇怪,我认为它会以任何一种方式执行,要么在 viewDidUnload 中,要么在 prepareForSegue 结束时。出于某种原因,这些 FRC 委托在视图控制器中非常持久。

    更新:

    我的瞬态属性也打错了。很确定就是这样。 PrimitiveProperty1 被设置为瞬态属性 1 和 2 ...自动完成填充它我猜 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多