2012-06-06 3 views
2

가져 오기 요청을 실행해야합니다. 하지만 내가 그것을 할 때 나는 NSManagedObject (각각의 객체는 약 5Mb 임) 오류가 없기 때문에 메모리 경고를 받는다. Apple은 코어 데이터 (객체가 RAM에로드되지 않은 경우)에 대해 가능성을 제공합니다. 그리고 나는이 목표를 사용하기 위해 내 물건을 원한다.핵심 데이터. ExecuteFetchRequest 오류가있는 NSManagedObjects (RAM이 아님)

여기에 내 코드 술어가 (id < 500)입니다

+ (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; 
} 

입니다.

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

객체의 모든 데이터가 아이폰의 RAM에 나타나기 때문에 후

응용 프로그램이 충돌합니다.

기본 옵션 returnsObjectsAsFaults = YES이 작동하지 않는 것 같습니다.

+0

오류 로그를 게시 할 수 있습니까? 또한 모델 및 이미지 (크기)에 대해 설명하십시오. –

+0

오류 로그가 없습니다. 그냥 메모리 경고하고 추락했습니다. 5 개의 객체 만 가져 오려고했는데 모든 것이 OK입니다 (fetchLimit 설정) –

답변

3

개체가 오류로 반환되고 있습니다. 이것을 isFault으로 확인할 수 있습니다. 문제는 핵심 데이터가 자동으로 해당 개체의 속성 값을 미리 가져 와서 행 캐시 (메모리)에 배치한다는 것입니다. NSFetchRequest 개체에서 includesPropertyValuesNO으로 설정하여이 동작을 해제 할 수 있습니다.

모든 내용과 성능에 대한 자세한 내용은 includesPropertyValues documentation을 참조하십시오.

제쳐두고 큰 개체를 데이터베이스에 직접 많이 저장하지 않을 수도 있습니다. iOS 5를 타겟팅하는 경우 external storage을 사용하거나 코어 데이터에서 이름/경로/ID를 사용하여 별도의 파일을 사용하는 방법을 고려해야합니다.

+0

고마워요. includesPropertyValues를 NO로 설정하면 도움이됩니다. –

+0

하지만 이제 또 다른 문제가 있습니다. 데이터를로드 할 때 각 개체에서 ID를 추출하고 싶지만 ID를 얻으 려 할 때 모든 개체가 RAM에 나타나고 마지막으로 응용 프로그램이 충돌합니다 (모든 개체가 RAM에 나타날 때). 다른 필드를 가져오고 나면 NSMAnagedObjects의 일부 필드를 표시 한 후 숨길 수 있습니까? (다른 객체가 필요하기 때문에 [컨텍스트 재설정] 제외) –

+0

모든 객체의 속성 하위 집합에 액세스하려면 @ meccan의 제안을 사용하고 id 속성과 함께 setPropertiesToFetch :를 사용하여 NSDictionaryResultType을 사용해야합니다. –

2

NSFetchRequest- (void)setResultType:(NSFetchRequestResultType)type을 설정하고 -(void)setPropertiesToFetch:(NSArray *)values 메서드로 개체에 대한 관련 특성 만 가져올 수 있습니다.

필요한 속성 만 지연로드합니다.

+0

1) 어떤 결과 유형을 설정해야합니까? (찾을 수 없습니다) 2) setPropertiesToFetch : 나중에 모든 속성을 사용해야합니다 –

+0

[setResultType 요청 : NSDictionaryResultType]; 하지만 그건 도움이 안된다 –

+0

그리고 setPropertiesToFetch 및 결과 형식을 설정해야합니다 : NSDictionaryResultType – CarlJ