【问题标题】:NSFetchedResultsController - track changes only to a subset of the propertiesNSFetchedResultsController - 仅跟踪对属性子集的更改
【发布时间】:2013-05-13 07:20:13
【问题描述】:

NSFetchedResultsController 监控对整个托管对象的更改,该对象正在跟踪。每当在当前上下文中修改任何属性时,例如

– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

被调用。如果更改非常频繁,这当然会影响连接到 FRC 的 UITableView 的性能。

是否可以只跟踪某些属性?我需要这个来利用 FRC 来处理那些更零星的更改,而不必在每次修改频繁更改的属性时都收到通知。

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller


    【解决方案1】:

    不,你不能。
    如果您需要更细粒度的观察,只需将属性分离到不同的实体即可。

    【讨论】:

      【解决方案2】:

      我将假设您正在使用更改类型 NSFetchedResultsChangeUpdate 调用此委托方法,因为对基础对象的更改与您显示数据的方式无关。这是正确的吗?

      正如前面的回答所说,不可能将 FRC 配置为忽略某些属性。

      我的第一个问题是,性能瓶颈到底是什么?更新只会发生在当前可见的单元格上,所以我想知道更新发生的频率或单元格的复杂程度是否会导致性能问题?

      为了忽略不影响单元格显示方式的更改,我会让单元格更智能。 IE。当您收到更改通知并重新配置单元格时,单元格本身可以检查是否有任何相关值实际上已更改。如果没有,您可以忽略更新。

      【讨论】:

      • 基本上我有一个代表下载的模型实体,其中包含读取的字节数、总字节数等信息。托管对象本身负责启动下载、恢复、更新进度值等,当然每次发生这种情况时,都会触发更新。在我的单元格上,我想显示每个下载的进度和当前状态(暂停、完成、失败......)。我开始认为像@Dan Shelly 建议的那样将实体分成两部分是唯一的解决方案,并且可能通过直接通知单元格来处理进度
      • 如果您想在单元格中显示下载状态和进度值的每次更改,您是否不需要收到通知?根据我从您的评论中了解到的情况,您需要 FRC 给您的所有通知,以便使用当前进度状态更新单元格?我错过了什么? :)
      • 理论上,你什么都没有。这正是我所做的。但是通过 FRC 获得如此多的更新,由于某种原因会降低表格的平滑度。当我滚动并获得频繁更新时,滚动看起来非常生涩。而且我认为文档中的某处还声明您应该使用 FRC 进行零星更新,也许是因为这个原因..
      • 我仍然想知道 frequent 是什么意思。比如 1/s、10/s、100/s?那么下一个问题将是导致性能问题的原因。当您忽略 FRC 委托调用(只是不更新​​单元)时,您是否仍然看到性能问题?如果没有,你的细胞是什么样子的?也许可以加快更新单元格的速度。此外,您可以决定仅在例如发生更改时更新单元格。进度值大于某个对显示很重要的阈值。
      • 好吧,我想更新单元格本身不是问题。我只是增加进度条的进度。我相信这实际上只是 FRC 过于频繁地做事,而且经常我的意思是每秒更多次(有一个流打开供下载,每次我得到一些字节时,我都会更新)。然后,如果我在 FRC 更新方法中什么都不做(没有单元格更新),问题仍然存在,所以我真的猜想在幕后发生了一些事情。如果我让更新每 5 秒触发一次,我会注意到每 5 秒发生一次小抖动。我想这确实是 FRS 的问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2016-05-22
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多