NSFetchedResultsController的复杂获取请求

时间:2015-06-29 19:59:52

标签: ios cocoa-touch core-data nsfetchedresultscontroller

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

  • 媒体具有财产状况'这可以是'上传'或者'上传'。
  • 用户拥有属性' syncStatus'这可能是“NotSynced'或者' Synced'。
  • ObjectX是一个'链接'用户和媒体之间的对象
  • 用户与ObjectX有很多关系
  • ObjectX与Media
  • 有一对一的关系

有没有办法使用NSFetchedResultsController来获取所有“同步”的用户?并且所有媒体都是“已经上载”#?当媒体'媒体'状态已更改,以便提取新用户。我听说NSFetchedResultsController不能很好地处理这些复杂的获取请求。

Model Graph

2 个答案:

答案 0 :(得分:1)

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

-(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]

答案 1 :(得分:0)

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

这比必须聚合每个对象模型的状态要有效得多。