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

如果您只对一个属性的最大值感兴趣,我建议您只获取一个对象

// 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];

然后只有一个对象被加载到内存中,而不是该实体的所有对象。

此外,您可以仅获取您感兴趣的属性而不是托管对象:

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

然后结果是一个字典数组,并且根本没有将托管对象加载到上下文中。这里需要注意的一点是,结果反映了持久存储中的当前状态,并且不考虑上下文中的任何未决更改、插入或删除。

于 2013-08-23T05:14:11.960 回答