objective-c - 排序和过滤核心数据关系的更有效方法是什么?

标签 objective-c ios core-data nspredicate nsfetchrequest

假设我有一个播客实体,其中有很多剧集,我很困惑其中哪一个是剔除和排序的首选选项:

// Always work with the relationship property
- (NSSet*)unfinishedEpisodes {
  NSArray* episodes = self.episodes.allObjects;

  NSPredicate* predicate = [NSPredicate predicateWithBlock:^BOOL(PodcastEpisode* episode, NSDictionary* bindings) {
    return !episode.isFinished;
  }];

  NSArray* unfinishedEpisodes = [episodes filteredArrayUsingPredicate:predicate];

  return [NSSet setWithArray:unfinishedEpisodes];
}

- (NSArray*)unfinishedEpisodesSortedByAge {
  NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES];

  return [self.unfinishedEpisodes.allObjects sortedArrayUsingDescriptors:sortDescriptors];
}

// Fetch specific sets of data as needed
- (NSArray*)unfinishedEpisodes:(NSArray*)sortDescriptors {  
  NSFetchRequest* fetch = [[NSFetchRequest alloc] initWithEntityName:@"Episode"];

  NSPredicate* predicate = [NSPredicate predicateWithFormat:@"podcast == %@ AND playcount == 0", self];
  fetch.predicate = predicate;

  fetch.sortDescriptors = sortDescriptors;

  NSArray* results = [KRTDataManager.sharedManager.mainObjectContext executeFetchRequest:fetch error:nil];

  return results;
}

- (NSArray*)unfinishedEpisodesSortedByAge {
  NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES];

  return [self unfinishedEpisodes:@[ sortDescriptor ]];
}

我内心会在 SQL 中尽可能多地做事,但很难认为选项 1 更好,但我读过的大部分内容似乎都表明,一旦播客使用 (NSSet*)episodes 就非常便宜物体就产生了。我对在这些情况下如何处理核心数据故障的理解相当不稳定,并且我意识到核心数据不应该与 SQL 数据库进行比较。不过,仅仅根据这两个选项的构造方式,我认为将谓词和排序描述符直接烘焙到获取中会有一些好处;但也许这还不足以弥补关系所带来的 yield 。

谢谢。

最佳答案

第一个代码在处理大型结果集时效率很低,因为它在内存对象中操作。所有对象都必须加载到内存中,因此如果它们尚不存在,则在引发错误时将一个一个加载它们。

第二个代码将在 SQL 端完成所有操作,并为您提供已经过滤和排序的结果。 CoreData 还使用内部缓存来优化此类查询,因此如果剧集尚未加载到其他地方,我更喜欢此选项。启用 CoreData 调试以查看 sql 查询的外观。 There is already an answer how to do that .

关于objective-c - 排序和过滤核心数据关系的更有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14190277/

相关文章:

objective-c - 枚举 ALAssetsLibrary

iphone - 如何找到连接到iphone的充电器类型?

iOS 8 : UITableViewCell detail text not correctly updating

ios - 没有可用应用程序时在浏览器中登录 Twitter

ios - 为什么(复制,非原子的)NSMutableArray 属性创建 NSArrays?

ios - 核心数据 - NSFetchrequest 获取实际数据量的两倍

iphone - YouTube视频无法在iPhone中使用

iphone - XCode 核心数据中的错误 : Expected specifier-qualifier-list before . ..

ios - '+entityForName : nil is not a legal NSManagedObjectContext parameter searching for entity name

ios - 无法更新核心数据中的位置