2

多くのエピソードを持つポッドキャストエンティティがあると仮定すると、これらのどれがカリングとソートの優先オプションになるかについて混乱しています。

// 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 *)エピソードを使用すると、ポッドキャストオブジェクトが入ると非常に安価であることを示しているようです存在。これらの状況で Core データの障害がどのように処理されるかについての私の理解はかなり不安定であり、Core データを実際に SQL データベースと比較すべきではないことを認識しています。ただし、2 つのオプションがどのように構成されているかだけに基づいて考えると、述語とソート記述子をフェッチに組み込むことには何らかの利点があると思います。しかし、関係によって提供されるセットがもたらす利益を補うには十分ではないかもしれません.

ありがとう。

4

1 に答える 1

2

最初のコードは、メモリ オブジェクト内で動作するため、大きな結果セットを操作する場合に非効率的になります。すべてのオブジェクトはメモリにロードする必要があるため、まだそこにない場合は、障害が発生したときに 1 つずつロードされます。

2 番目のコードは、SQL 側ですべてを実行し、すでにフィルタリングおよびソートされた結果を提供します。CoreData は内部キャッシュも使用してそのようなクエリを最適化するため、エピソードがまだどこかに読み込まれていない場合は、このオプションをお勧めします。CoreData デバッグを有効にして、SQL クエリがどのように表示されるかを確認します。それを行う方法はすでに答えがあります

于 2013-01-07T08:41:11.370 に答える