我是Core Data的新手,我构建了一种音乐库应用,该应用具有两个标签:“
歌曲和艺术家”标签,其中显示了一个艺术家列表,其中列出了每个艺术家的总歌曲数和总歌曲时长(每个艺术家行也是如此)
我的核心数据对象:
Song
=====
name
duration
album
artist (to one relationship)
Artist
======
name
songs (to many relationship)
因此,现在我可以显示一个艺术家列表,并且每个艺术家的歌曲总数为:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// i know i should reuse the cells..
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
Artist *artist = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%@ %lu", artist.name, (unsigned long)artist.songs.allObjects.count];
return cell;
}
我有两个问题:
artist.songs.allObjects.count
,核心数据会提取所有歌曲吗?因为我真的不需要歌曲对象。首先,当您访问关系时,您不必担心Core Data在后台会做什么。特别是在获取结果的过程中,控制器Core Data将找到性能和内存占用的最佳组合。也许这就是关于拥有对象图而不是关系数据库的全部要点。
仍然最好跳过allObjects
并简单地打电话
artists.songs.count
其次,对于持续时间计算,您可以利用所有托管对象都符合键值编码的事实。您可以像这样使用集体运算符:
NSNumber *totalDuration = [artist.songs valueForKeyPath:@"@sum.duration"];
同样,Core Data框架将确保您获得非常高效和高性能的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句