내 프로젝트에서 다음과 같이 만든 JSON 파일을 다운로드해야합니다.
[{"id":"2","n":"One"},{"id":"2","n":"Two"},{"id":"2","n":"Three"},...]
내 코드는 다음과 같습니다.
- (void) startPopulate:(NSArray *)array{
NSManagedObjectContext *context = [[self sharedAppDelegate] managedObjectContext];
NSFetchRequest *fetchRequest=[NSFetchRequest fetchRequestWithEntityName:@"Myentity"];
NSError *error = nil;
for (id element in array){
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"id == %@",[element objectForKey:@"id"]]];
Myentity *myE = [[context executeFetchRequest:fetchRequest error:&error] lastObject];
//update
if (myE != nil){
myE.id_e = [element objectForKey:@"id"];
myE.name = [element objectForKey:@"n"];
}
//new element
else{
Myentity *myE = [NSEntityDescription insertNewObjectForEntityForName:@"Myentity" inManagedObjectContext:context];
myE.name = [element objectForKey:@"n"];
myE.id_e = [element objectForKey:@"id"];
}
}
if (![context save:&error]) {
NSLog(@"couldn't save: %@", [error localizedDescription]);
}
else{
NSLog(@"DB UPDATED");
}
}
보시다시피 사전 배열을 메서드에서 전달하고 엔티티가 있는지 여부를 확인합니다. 그것은 잘 작동하고 나는 특정 문제가 없습니다. '문제'는 호출하는 방법이라면 12000 개의 요소가 있고이 메서드는 약 53 초 동안 실행된다는 것입니다. 매우 느립니다. 더 빨리 만들기 위해 어떤 유형의 솔루션을 채택 할 수 있습니까? 아니면이 메서드를 백그라운드 프로세스 안에 넣어야합니까? 감사
백그라운드 프로세스에 넣어야합니까?
물론. 백그라운드 스레드를 시작하고 모든 작업을 수행 할 기본 컨텍스트에서 자식 컨텍스트를 만듭니다.
그 밖에 할 수있는 일
관리 개체 컨텍스트에 대한 저장되지 않은 모든 변경 사항은 메모리에 저장됩니다. 저장하기 전에 수천 번 변경하는 것은 많은 메모리를 필요로하지만 저장 시간이 오래 걸리기 때문에 권장하지 않습니다.
업데이트를 한 번에 100 개의 변경 사항으로 일괄 처리하고 각 블록 100 개를 저장할 수 있습니다.
대안
앱에 대해 이러한 항목을 항상로드하는 경우 해당 항목을 DB에 미리로드하고 앱 자체에 번들링 할 수도 있습니다.
이렇게하면 이미 거기에 있으므로 런타임에 저장할 필요가 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다