【问题标题】:Complex fetch-request for NSFetchedResultsControllerNSFetchedResultsController 的复杂获取请求
【发布时间】:2015-09-16 10:30:29
【问题描述】:

这是我的模型的简化外观:

  • 媒体的“状态”属性可以是“上传中”或“已上传”。
  • 用户的属性“syncStatus”是“NotSynced”或“Synced”。
  • ObjectX 是用户和媒体之间的“链接”对象
  • 用户与 ObjectX 有一对多关系
  • ObjectX 与 Media 具有一对一的关系

有没有办法使用 NSFetchedResultsController 来获取所有“同步”且所有媒体都“上传”的用户?当“媒体”状态发生变化时,它也必须更新其内容,以便获取新用户。我听说 NSFetchedResultsController 不能很好地处理如此复杂的获取请求。

【问题讨论】:

    标签: ios cocoa-touch core-data nsfetchedresultscontroller


    【解决方案1】:

    我同意用户应该有另一个状态标志(或使用同步状态标志)。您可以通过覆盖媒体对象中的设置器在中心点更新它。

    -(void)setStatus:(MediaStatus)value {
      [self willChangeValueForKey:@"status"];
      [self setPrimitiveStatus:value];
      [self didChangeValueForKey:@"status"];
    
      // get status of other media objects
      NSSet *objects = self.objectx.user.objects;
      NSSet *updatingObjects = 
         [objects filteredSetUsingPredicate:
         [NSPredicate predicatesWithFormat:@"media.status = %@", kUpdatingStatus]];
      self.objectx.user.updating = 
         updatingObjects.count ? kUpdatingStatus : kUpdatedStatus;
    }
    

    不过,适当的 FRC 谓词也应该有效。例如,只显示更新的用户,类似于

    [NSPredicate predicateWithFormat:@"any objectx.media.status = $@", kUpdatedStatus]
    

    【讨论】:

    • 感谢您提供代码 :) 我们错过了一个边缘案例。当已删除的媒体状态正在更新,而其余媒体均已更新时,用户状态应更改为已更新。
    【解决方案2】:

    通过非规范化数据来对提取进行建模会更实用。您可以向用户添加一个“状态”布尔值,指示是否已上传所有媒体。

    这比汇总每个对象模型的状态要高效得多。

    【讨论】:

    • 如何将这样的布尔值添加到用户,以便它始终保持最新?
    • 您将在插入或更新媒体时更新用户状态。例如,如果您添加新媒体,并且其状态为“正在上传”,您还需要将其对象的 User.status 更改为“正在上传”。
    猜你喜欢
    • 2016-09-24
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多