NSFetchedResultsController 的复杂获取请求
Complex fetch-request for NSFetchedResultsController
这是我的模型的简化外观:
- 媒体有 属性 'status',可以是 'Uploading' 或 'Uploaded'。
- 用户 属性 'syncStatus' 是 'NotSynced' 或 'Synced'。
- ObjectX 是用户和媒体之间的 'linking' 对象
- 用户与 ObjectX 具有一对多关系
- ObjectX 与 Media 具有一对一关系
有没有什么方法可以使用 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]
这是我的模型的简化外观:
- 媒体有 属性 'status',可以是 'Uploading' 或 'Uploaded'。
- 用户 属性 'syncStatus' 是 'NotSynced' 或 'Synced'。
- ObjectX 是用户和媒体之间的 'linking' 对象
- 用户与 ObjectX 具有一对多关系
- ObjectX 与 Media 具有一对一关系
有没有什么方法可以使用 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]