2017-10-30 14 views
0

큰 XML 파일을 읽으려면 NSXMLParser을 사용하고 있습니다. 일단 내가 원하는 데이터 요소를 얻으면 NSManagedObject을 만들고이를 배경 컨텍스트에 저장하십시오. 가져온 파일에 n 개의 가져온 항목이 있으므로 절대 알 수 없습니다. XML 파일이 읽기 완료 및 내 모든 Core Data 객체가 저장 완료하면코어 데이터가 NSXMLParser를 사용하여 모든 엔티티를 저장 한 시점을 알 수 있습니다.

NSManagedObjectContext *backgroundContext = [ZSSCoreDataManager sharedService].persistentContainer.newBackgroundContext; 
[backgroundContext performBlock:^{ 

    // Create and insert new entity here 
    [self createAndInsertWithDictionary:object]; 

    // Save 
    if ([backgroundContext hasChanges]) { 
     NSError *error = nil; 
     if (![backgroundContext save:&error]) { 

      NSLog(@"%@", error); 

     } 

     // Save was successful, reset to release memory 
     [backgroundContext reset]; 

    } 

}]; 

구문 분석을 완료 할 수있는 save:보다 더 빨리 일어날 수 있기 때문에는 어떻게 알 수 있습니까? parserDidEndDocument: 메서드를 알고 있지만 내 개체가 모두 Core Data에 저장 완료되면이를 알 수 없습니다.

아이디어가 있으십니까?

답변

1

확실한 방법은 을 performBlockAndWait으로 바꾸는 것입니다. 그러면 블록이 완료되면 저장도 완료됩니다.

기다리고 싶지 않은 경우 디스패치 그룹의 작업처럼 들립니다. 비동기 코드가 끝난 후에 만 ​​함수 호출을 예약 할 수 있습니다.

  • dispatch_group_create
  • 당신이 블록 중 하나를 시작할 때마다 디스패치 그룹을 만들고 다른 작업을 수행하기 전에 dispatch_group_enter를 호출합니다.
  • 다른 이름으로 저장이 완료 될 때마다, 모든이 "입력"경우에만 실행됩니다 블록을 예약 dispatch_group_leave
  • 사용 dispatch_group_notify 전화에 "두고"일치하고있다.

저장이 완료 될 때마다 실행해야하는 "알림"블록에 코드를 넣으십시오.

+0

디스패치 그룹 패턴을 상당히 많이 사용했지만,이 상황에서 xml 개체가 구문 분석 된 후 'dispatch_group_enter'가 호출되어 다른 dispatch_group_enter가 만들어지기 전에 매우 빠르게 저장되면 어떻게 작동하는지 궁금해했습니다. 그러므로'dispatch_group_notify'가 호출 될 수 있습니다. 나는 이것에 대해 틀린가? –

+0

방금 ​​테스트 한 결과'dispatch_group_notify '가 바로 실행됩니다. 다른 아이디어? –

+1

예 - 프로세스를 시작하기 전에 "입력"을 추가하십시오. 'parserDidEndDocument'에 "leave"를 추가하십시오. 그런 다음 파서가 완료되기 전에 notify 블록을 호출 할 수 없습니다. –