NSFetchedResultsController 的复杂获取请求

Complex fetch-request for NSFetchedResultsController

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

有没有什么方法可以使用 NSFetchedResultsController 来获取 'Synced' 且所有媒体都是 'Uploaded' 的所有用户?当 'Media' 状态更改时,它也必须更新其内容,以便获取新用户。我听说 NSFetchedResultsController 不能很好地处理如此复杂的获取请求。

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

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

我同意用户应该有另一个状态标志(或使用同步状态标志)。您可以通过覆盖媒体对象中的 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]