2

배경 핵심 데이터 프로세스에서 상당한 양의 블로그를 읽었지만 많은 BG 핵심 데이터 태스크를 한 번에 모두 관리하고이를 다시 알려주는 방법을 가장 잘 이해할 수는 없습니다 정의되지 않은 시간에 메인 스레드 (MOC)에 전송한다.여러 개의 NSManagedObjectContexts - 경쟁 조건 및 교착 상태 방지

난 당신이 내가 멋진 비동기 작업 완료를 얻을 수 [context performBlock를 사용하여 함께 NSManagedObjectContextDidSaveNotification에 가입하여 NSThread 그 당 1 NSManagedObjectContext을 해야하는 알고 있어요.

이 일부 중복되고 난의 형태로 관찰 경쟁 조건이있을 때, 나는 100 % ...

  • BG MOC 1 모르는 내가 비동기 작업을 많이하고 있는데, 말했다
  • BG MOC (2) 그것의 작업
  • BG MOC이 개 완료 작업 및 알림이 전송 저장
  • BG MOC 1 개 완료 작업과 이후 떨어진 잎사귀 BG MOC의 2 초에 출발했다 그것의 작업에 출발했다
변경

내 전반적인 질문은 어떻게 여러 MOC에서 경쟁 조건을 해결할 수 있습니까?

  1. 올바른 동작으로 스레드 당 1 MOC가되는 경우 NSThread ivar을 만들고 코어 데이터 작업을 모두 수행 할 수 있습니까? 그렇게하면 자신과 동시에 작동하는 하나의 MOC를 가질 수 있습니까?

  2. NSLock은 여러 스레드에서 동시에 액세스 할 수있는 특정 코드를 피할 수있는 해결책 일 수는 있지만 읽지 못했습니다. 잠금이 필요한 항목을 모르겠습니다. 컨텍스트 저장 방법? 영속 저장소 (다중 스레드를 무의미하게 만드는 것처럼 보입니다)?

  3. 마지막으로 내 MOC에 태그를 추가 할 수 있습니까? 그런 식으로 다른 작업이 실행 중임을 알면 데이터를 덮어 쓰지 않도록 인스턴스를 만든 순서대로 알림을 저장하고 처리 할 수 ​​있습니다. 스레드 당

답변

14
  1. 한 MOC 권장합니다. 예외가 있지만 일반적인 규칙은 여전히 ​​적용됩니다. NSThread 개체를 만들지 마십시오. 그냥 하지마. 너무 많은 고통. 대신 블록 또는 NSOperation 인스턴스를 사용하십시오. 그들은 쉽게 구제를하고 많은 고통으로부터 당신을 보호합니다.

  2. 코어 데이터와 함께 잠금을 사용하지 마십시오. 핵심 데이터는 올바르게 사용될 때 자체 잠금을 수행하고 주변에 자물쇠를 던지면 문제가 발생할 수 있습니다. 이상적으로는 이 아니어야합니다.은 현대 Objective-C에서 스스로를 잠글 필요가 있습니다.

  3. ivar 또는 속성 참조가 아닌 MOC의 이름을 지정할 수 없습니다. 당신도 그럴 필요가 없습니다.

    • 당신은 메인 스레드/UI의 MOC를 다음과 같이

코어 데이터와 멀티 스레딩을 수행하는 가장 깨끗한 방법입니다. 그것이 당신의 진실의 원천입니다. 귀하의 UI는 그것으로부터 피드를 받아 그것에 씁니다.

  • 모든 백그라운드 프로세스는 NSOperation 또는 이와 유사한 구조로 이루어집니다. 이 구조 안에 MOC를 만들고 주 컨텍스트에 자식 컨텍스트가 있습니다.
  • 자식을 저장하면 변경 내용이 부모 (UI MOC)에 병합됩니다.
  • 주 MOC에 적합한 병합 정책을 설정하십시오. 상황에 따라 다른 정책이 필요하다고 생각하면 어떻게하는지 재 작업해야합니다.
  • 이상적으로 각 백그라운드 프로세스는 다른 프로세스와 충돌하지 않고 자체적으로 작동 할 수있는 데이터 격납고 여야합니다. 충돌이있는 경우 비즈니스 논리에서 해결해야하는 병합 문제입니다.

    두 개의 백그라운드 작업이 동일한 데이터 부분에 도달하는 상황이 발생하면 병렬로 실행하지 말고 순서대로 실행해야합니다. 같은 데이터에 대한 병렬 편집은 고통을 기다리고 있습니다. 그러지 마세요.

    인스턴스를 NSOperationQueue 인스턴스를 사용하여 순차적으로 또는 병렬로 제어 할 수 있습니다.

    이러한 규칙을 따르면 경쟁 조건이나 교착 상태가 발생하지 않습니다.

    +0

    위대한 답변, 많은 감사. 구현시'NSOperation' /'NSOperationQueue'를 사용하지 않았으므로 여기에서 시작하겠습니다. 다행스런 사기극 아이디어를 얻는다면 다행입니다. – Magoo

    +1

    "NSOperation 또는 이와 유사한 구조입니다.이 구조체 대신 MOC를 생성해야합니다."이 구조체 내부에 있어야합니까? –

    +0

    감사합니다. @anDundas가 수정되었습니다. –