Program Club

Core Data 다중 스레드 애플리케이션

proclub 2020. 11. 25. 21:25
반응형

Core Data 다중 스레드 애플리케이션


다중 스레드 방식으로 핵심 데이터를 사용하려고합니다. 백그라운드에서 새 데이터를 다운로드하는 동안 이전에 다운로드 한 데이터로 응용 프로그램을 표시하고 싶습니다. 이렇게하면 사용자가 업데이트 프로세스 중에 애플리케이션에 액세스 할 수 있습니다.

대리자를 사용하여 비동기 적으로 파일을 다운로드하는 NSURLConnection이 있고 (및 진행률 표시) XMLParser를 사용하여 새 데이터를 구문 분석하고 자체 persistStore 및 별도의 스레드를 사용하여 별도의 컨텍스트에서 새 NSManagedObjects를 만듭니다.

문제는 이전 개체와 동일한 컨텍스트에서 새 개체를 만들면서 표시하는 동안 BAD_INSTRUCTION 예외가 발생할 수 있다는 것입니다. 그래서 새 데이터에 대해 별도의 컨텍스트를 사용하기로 결정했지만 완료되면 모든 개체를 다른 컨텍스트로 이동하는 방법을 알아낼 수 없습니다.

Paolo aka SlowTree


Apple Concurrency with Core Data 문서 는 시작점입니다. 정말 조심스럽게 읽으세요 ... 오해에 여러 번 물 렸어요!

기본 규칙은 다음과 같습니다.

  1. NSPersistentStoreCoordinator프로그램 당 하나씩 사용하십시오 . 스레드 당 필요하지 않습니다.
  2. NSManagedObjectContext스레드 당 하나씩 만듭니다 .
  3. NSManagedObject스레드의를 다른 스레드로 전달하지 마십시오 .
  4. 대신 객체 ID를 가져 와서 -objectID다른 스레드로 전달하십시오.

더 많은 규칙 :

  1. 개체 ID를 가져 오기 전에 개체를 저장소에 저장해야합니다. 저장 될 때까지 임시적이며 다른 스레드에서 액세스 할 수 없습니다.
  2. 그리고 둘 이상의 스레드에서 관리 대상 개체를 변경하는 경우 병합 정책에 유의하십시오.
  3. NSManagedObjectContext-mergeChangesFromContextDidSaveNotification:도움이됩니다.

하지만 반복하겠습니다. 문서를주의 깊게 읽어주세요! 정말 그만한 가치가 있습니다!


현재 [2015 년 5 월] Apple Concurrency with Core Data 문서 는 iOS 5의 향상된 기능을 다루지 않으므로 더 이상 핵심 데이터를 동시에 사용하는 최상의 방법을 보여주지 않기 때문에 기껏해야 오해의 소지가 있습니다. iOS 5에는 부모 컨텍스트와 새로운 동시성 / 스레딩 유형이라는 두 가지 매우 중요한 변경 사항이 있습니다.

이러한 새로운 기능을 포괄적으로 다루는 문서를 아직 찾지 못했지만 WWDC 2012 비디오 "Session 214-Core Data Best Practices" 에서이 모든 것을 잘 설명합니다.

Magical Record 는 이러한 새로운 기능을 사용하며 살펴볼 가치가 있습니다.

실제 기본 사항은 여전히 ​​동일합니다. 관리되는 개체 컨텍스트가 생성 된 스레드의 관리 개체 만 사용할 수 있습니다.

이제 [moc performBlock :]을 사용하여 올바른 스레드에서 코드를 실행할 수 있습니다.

mergeChangesFromContextDidSaveNotification을 사용할 필요가 없습니다. 더 이상; 대신 하위 컨텍스트를 만들어 변경 한 다음 하위 컨텍스트를 저장하십시오. 자식 컨텍스트를 저장하면 변경 사항이 부모 컨텍스트에 자동으로 푸시되고 변경 사항을 디스크에 저장하려면 해당 스레드의 부모 컨텍스트에 저장을 수행하면됩니다.

이 작업을 수행하려면 동시 유형으로 상위 컨텍스트를 만들어야합니다. 예 :

mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

그런 다음 백그라운드 스레드에서 :

context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
[context setParentContext:mainManagedObjectContext];

<... perform actions on context ...>

NSError *error;
if (![context save:&error])
{
    <... handle error ...>
}
[mainManagedObjectContext performBlock:^{
    NSError *e = nil;
    if (![mainContext save:&e])
    {
        <... handle error ...>
    }
}];

멀티 스레드 환경에서 핵심 데이터를 사용하여 문제를 해결하는 모든 사람들에게 도움이되기를 바랍니다.

Apple 문서에서 "Top Songs 2"를 살펴보십시오. 이 코드로 저는 Matrix의 "빨간 알약"을 가져 와서 이중 무료 오류와 결함없이 새로운 세계를 발견했습니다. :디

도움이 되었기를 바랍니다.

파올로

추신 Yuji 덕분에 위에서 설명한 문서에서 그 예를 찾았습니다.

참고 URL : https://stackoverflow.com/questions/2138252/core-data-multi-thread-application

반응형