1

次のコードを使用して、Core Data の属性の最大値を取得しています

- (NSDate*)latestDateForLocalEntity:(NSString*)entityString
   key:(NSString*)key 
   inManagedObjectContext:(NSManagedObjectContext*)context {

   NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityString];
   NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:YES];
   request.sortDescriptors = @[sortDescriptor];
   NSError *localError;
   NSArray *localResults = [context executeFetchRequest:request error:&localError];
   id result = localResults.lastObject;

   NSDate *latestLocalDate = [result valueForKey:key];
   NSLog(@"Latest local date for entity %@ (%@): %@",entityString,key,latestLocalDate);

   // fault newly created objects - don`t need to keep them in RAM:
   [localResults enumerateObjectsUsingBlock:^(NSManagedObject *managedObject, NSUInteger idx, BOOL *stop) {
      [context refreshObject:managedObject mergeChanges:NO];
   }];

   // even context reset does not help reducing RAM consumption:

  [context reset];
  localResults = nil;
  return latestLocalDate;

コードはすべてのエンティティを取得し、それらを値で並べ替え、最後のオブジェクトを取得して最大値を取得します。次に、RAM を解放するために値を (再) フォールトしようとします[context refreshObject:managedObject mergeChanges:NO]

ただし、メモリは解放されていないようです (約 400.000non-objectオブジェクトがメモリに保持されます)。

オブジェクトを再フォールトしようとして、管理対象オブジェクト コンテキストをリセットしようとしているコードの何が問題になっていますか? メモリを解放しないのはなぜですか?

4

1 に答える 1

1

1 つの属性の最大値のみに関心がある場合は、1 つのオブジェクトのみをフェッチすることをお勧めします。

// Sort descending to that the first object is that with the maximum value.
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:key ascending:NO];
[request setSortDescriptors:@[sortDescriptor]];
[request setFetchLimit:1];

次に、そのエンティティのすべてのオブジェクトではなく、1 つのオブジェクトのみがメモリに読み込まれます。

さらに、管理対象オブジェクトの代わりに、関心のある属性のみを取得できます。

[request setResultType:NSDictionaryResultType];
[request setPropertiesToFetch:@[key]];

結果は辞書の配列になり、管理対象オブジェクトはコンテキストにまったくロードされません。ここでの注意点の 1 つは、結果が永続ストアの現在の状態を反映しており、コンテキスト内の保留中の変更、挿入、または削除が考慮されていないことです。

于 2013-08-23T05:14:11.960 に答える