2012-05-07 3 views
1

내 응용 프로그램이 웹 서비스를 사용해야하고 json에서 일부 데이터를 가져와야합니다. json을 구문 분석하고 내 영구성 저장소의 데이터를 피드해야합니다. 실제 장치에서 내 응용 프로그램을 테스트 할 때까지 모든 것이 훌륭하게 작동했습니다. 응용 프로그램은 좌절감을 느낄 때까지 기다렸다가 마침내 내 얼굴에 구멍을 뚫습니다. 여기 X- (핵심 데이터 장치의 성능 문제

I 1000 번 결합 주위 I이 조작을해야 insertOrReplaceObjectForEntityForName 여기

+(id) insertOrReplaceObjectForEntityForName:(NSString *)entityName inManagedObjectContext:_context WithPredicateString:(NSString *)predicateString, ...{ 

    NSManagedObject *object; 

    va_list ap; 
    va_start(ap, predicateString); 

    NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:entityName]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat:predicateString arguments:ap]; 
    [req setPredicate:pred]; 

    int count = [_context countForFetchRequest:req error:nil]; 

    if(count > 0){ 
     NSArray *arr = [_context executeFetchRequest:req error:nil]; 
     object = [arr objectAtIndex:0]; 
    } 
    else{ 
     object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:_context]; 
    } 

    va_end(ap); 

    return object; 
} 

한 줄의 간단한 조작으로이 약 0.004 초 복용 및 데이터를 파싱하는 방법을 많은 다른 작업들로 인해 구문 분석이 너무 많이 진행됩니다. 이미 기본 데이터베이스에 많은 마약이 있고 마약이 존재하는지 확인해야합니다. sts 나는 그것의 가치를 편집해야합니다.

Drug *drug = [NSEntityDescription insertOrReplaceObjectForEntityForName:@"Drug" inManagedObjectContext:parsingContext WithPredicateString:[NSString stringWithFormat:@"drugId == '%@'",[drugDetails objectForKey:@"DrugId"]]]; 

나는 응용 프로그램에서 유지 관리 이력을 유지하기 위해 핵심 데이터를 사용했지만, 지금은 내가 여기에 누군가가 나를 도울 수 없다면, 핵심 데이터에서 벗어나 역사를 유지 잊어해야합니다 생각합니다. 나는 이미 내 응용 프로그램을 만드는 데 많은 시간을 보냈으며 이제 클라이언트가 내 다리를 치고있다, 어떤 제안 ??

+1

1000은 핵심 데이터입니다. 카운트를 건너 뛰십시오. '[_context executeFetchRequest : req error : nil];'이 0 개체를 반환하면 카운트 작업이 필요 없습니다. 다른 작업은 한 번에 20 개의 약물 ID를 묶어서 가져 오기 횟수를 줄이는 것입니다. 마지막으로이 모든 것이 백그라운드 대기열에서 발생하는지 확인하십시오. – amattn

+0

백그라운드 큐 등을 돌 보았습니다.하지만 문제는 가져 오기가 많은 시간을 들여서 많은 주름으로 성능을 저하시키고 있다는 것입니다. –

+0

한번에 모든 레코드를 가져오고 filteredArrayUsingPredicate 메소드를 사용하는 것이 더 빠르다고 생각합니까? –

답변

1

인 Yogesh,

당신이보고있는 지연은 iOS 장비에 코어 데이터에서하지만 플래시의 느린 속도에서 특히 아니다. 어떻게 이것을 완화합니까?

플래시는 매우 큰 블록 (128KB)을 읽고 DB 분산 수집 작업에서 버려야합니다. 따라서 각 가져 오기에서 가능한 한 많은 데이터를 가져 오려고합니다.

코드는 json에서 항목 당 가져 오기를 수행합니다. 인스 트루먼 트의 저수준 도구를 사용했다면, 내 애플 리케이션에서와 마찬가지로, 아마 당신의 앱이 플래시를 기다리는 것이 대부분 유휴 상태임을 알 수 있습니다.

in 조건 자 연산자를 사용하여 집계 페치를 작성합니다. 자, drugID을 모두 집합이나 배열로 모으십시오. BTW, 귀하의 json에 따라,이 코드는 -valueForKey:을 사용하여 한 줄로 자주 수행 할 수 있습니다. 이 술어 형식에서와 같이 :

여기서 drugDetails은 오브젝트의 배열입니다. 이 검색을 통해 DB는 모든 페이지 페치를 집계 할 수 있습니다. 그런 다음 이미 존재하는 레코드의 배열을 반환합니다. 그런 다음 설정 작업을 사용하여 원하는대로 레코드를 업데이트하거나 만들도록 선택할 수 있습니다. 그런 다음 하나의 플래시로 플래시를 플러시 할 수 있습니다 -save:.

앤드류

+0

Adonoho에 감사드립니다. 정말 도움이되었습니다. 그런데 IOW와 BTW의 의미는 무엇입니까? –

+0

Yogesh, IOW == 다른 단어들; BTW == 방법. BTW, predicate 형식에는 불필요한 문자가 있습니다. @ "drugId in % @", [drugDetails valueForKey : @ "DrugId"]'. 또한 내 대답이 가장 유용하다고 판단되면 위/아래 화살표로 체크 표시를 확인하십시오. 앤드류 – adonoho

+0

당신이 내 qn에 +1을 주면 당신에게 투표 할 수있을 것입니다. –