2

我需要执行获取请求。但是当我这样做时,我没有得到 fault NSManagedObject(每个对象大约为 5 Mb,这就是我收到内存警告的原因)。Apple为 Core Data 提供了出错的可能性(当对象未加载到 RAM 中时)。我希望我的对象使用这种可能性。

这是我的代码

+ (NSMutableSet *)GetImagesWithPredicate:(NSPredicate *)predicate
{
    NSString *entityName = kEntityName;
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];;
    NSManagedObjectContext *context = appDelegate.managedObjectContext;
    NSEntityDescription *entityDesctiption = [NSEntityDescription 
                                              entityForName: entityName
                                              inManagedObjectContext:context];

    // find object
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesctiption];
    [request setPredicate:predicate];
    NSArray *objects = [context executeFetchRequest:request error:nil];
    [request release];
    if (objects == nil)
    {
        NSLog(@"there was an error");
        return nil;
    }
    NSMutableSet *set = [NSMutableSet setWithArray:objects];
    return set;
}

谓词在哪里(id < 500)

应用程序崩溃后

NSArray *objects = [context executeFetchRequest:request error:nil];

因为对象的所有数据都出现在 iPhone 的 RAM 中。

似乎默认选项returnsObjectsAsFaults = YES不起作用。

4

2 回答 2

3

对象可能作为故障返回;您可以使用 来验证这一点isFault。问题是 Core Data 会自动预取这些对象的属性值并将它们放在行缓存中(在内存中)。您可以通过在对象上设置includesPropertyValues为来禁用此行为。NONSFetchRequest

有关所有这些和性能影响的详细信息,请参阅includesPropertyValues 文档

顺便说一句,您可能不想直接在数据库中存储大量大型对象。如果您的目标是 iOS 5,您可能应该考虑使用外部存储,或者您自己在 Core Data 中使用带有名称/路径/id 的单独文件。

于 2012-06-06T13:58:48.093 回答
2

you could set the - (void)setResultType:(NSFetchRequestResultType)type for the NSFetchRequest and only get the relevant attributes for your Object with the -(void)setPropertiesToFetch:(NSArray *)values Method.

And only lazy loading the needed attributes.

于 2012-06-06T13:38:05.227 回答