2014-01-27 4 views
2

부모/자식 동시성 패턴을 사용하여 큰 데이터 청크를 가져옵니다. 가져 오기는 다음과 같이 기본 스레드를 차단하지 않고 백그라운드에서 수행됩니다.NSManagedObjectContext 취소 performBlock

NSManagedObjectContext *temporaryContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
temporaryContext.parentContext = mainMOC; 

[temporaryContext performBlock:^{ 
    // import data … 

    // push to parent 
    NSError *error; 
    if (![temporaryContext save:&error]) { 
     // handle error 
    } 

    // save parent to disk asynchronously 
    [mainMOC performBlock:^{ 
     NSError *error; 
     if (![mainMOC save:&error]) { 
     // handle error 
     } 
    }]; 
}]; 

모든 것이 잘 작동하지만 데이터 가져 오기를 취소해야하는 경우 어떻게해야합니까? performBlock을 취소 할 수있는 방법이 있습니까?

답변

1

아니오 블록 및 기타 모든 동기 작업을 암시 적으로 취소 할 수 없습니다.

취소 가능하도록 프로그래밍해야합니다.

예 : 여기 아마도 ... performBlock을 N 개의 호출로 나눠서 각각은 거의 작동하지 않습니다.

0

다른 사람이 같은 문제가있는 경우 내 솔루션은 동일한 영구 저장소 코디네이터에 연결된 두 개의 독립적 인 관리되는 개체 컨텍스트를 사용하는 것이 었습니다. 과도한 작업을 수행하는 관리 객체 컨텍스트는 NSOperation 하위 클래스에 캡슐화됩니다. NSOperation은 언제든지 취소 할 수 있습니다. Apple이 제공 한 예제에 대한 link입니다.

+0

죄송합니다 - 잘못된 샷시입니다 ... 한 번 작동을 시작한 후에 취소 할 수 없습니다. 취소되지 않은 경우 취소 할 수 없습니다. NSOperations에는 cancel 메소드가 있지만 작업 상태 만 설정합니다. 작동을 취소했는지 확인하기 위해 배경 컨텍스트를 저장하기 전에 상태를 확인하기 위해 프로그램을 작성해야합니다 ( –

+0

). 취소 된 경우 문맥을 저장하지 않습니다. – sash

관련 문제