2

저는 CoreData를 기반으로하는 iPad 요리 응용 프로그램을 작성하고 있습니다. 이 목록의 각 레시피 카테고리 \ 하위 범주 및 국가 mergeChangesFromContextDidSaveNotification의 컨텍스트 동기화시 코어 데이터 충돌 (EXC_BAD_ACCESS)

  • 다른 모든 요리법 관련 정보
    1. 목록 : 내 응용 프로그램에서 나는 정보의 2 종류의 레시피를 편집 화면이 popover에서 편집 할 수 있습니다. 이 목록의 변경 사항은 즉시 지속됩니다 (즉, 사용자가 가능한 카테고리 목록에 일부 레시피 카테고리를 추가하지만 레시피 생성을 취소하는 경우이 카테고리는 모든 레시피에서 사용 가능함). 목록에 대한 컨텍스트을 지원 주요 상황에 맞는 조리법 관리를위한: 그것은 정보의 각 유형을 처리 할 수 ​​2 개의 별도 NSManagedObjectContexts을 구현하기 위해 descided했다.

      모든 코어 데이터 작업은 MagicalRecord 프레임 워크를 통해 수행됩니다. MagicalRecord의 기본 컨텍스트를 부모로 갖는 두 컨텍스트입니다. 각 상황은 다른 상황의 변화를 관찰합니다. 주 스레드에 모든 컨텍스트가 만들어지고 사용되고 있으므로이 문제는 멀티 스레드 문제와 관련이없는 것 같습니다.

      지원 컨텍스트에서 개체를 만들려고 할 때 개체 작성 직후에 지원 컨텍스트의 변경 사항을 계속 유지하려고하면 모든 작업이 정상적으로 수행됩니다. 문제는 새로 생성 된 객체가 생성 직후에 삭제되는 경우입니다 (EXC_BAD_ACCES가 수신 됨). 그러나 엔티티가 올바르게 유지되고 있으며 다음에 실행될 때 동기화 문제없이 사용되거나 삭제 될 수 있습니다.

      참고 : 에서 개체에 액세스 할 때 주 컨텍스트 NSManagedObjectContext의 existingObjectWithID : 메서드를 사용하면이 개체를 삭제할 수 있습니다. 그러나 주 컨텍스트 (주 컨텍스트와 보조 컨텍스트 모두의 부모 컨텍스트)에서 충돌이 발생합니다.

      엔티티 생성 :

      RecipeCategory* category = [RecipeCategory MR_createInContext:_supportingContext]; 
      category.name = itemName; 
      [_supportingContext MR_saveToPersistentStoreAndWait]; 
      

      엔티티 삭제 : 여기

      내 코드입니다

      [(RecipeCategory*)itemToRemove MR_deleteEntity]; 
      [_supportingContext MR_saveToPersistentStoreAndWait]; 
      

      컨텍스트 생성 및 관찰 설정 :

      [_mainContext MR_stopObservingContext:_supportingContext]; 
      [_supportingContext MR_stopObservingContext:_mainContext]; 
      _mainContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]]; 
      _supportingContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]]; 
      [_mainContext MR_observeContextOnMainThread:_supportingContext]; 
      [_supportingContext MR_observeContextOnMainThread:_mainContext]; 
      

      조언을 주시기 바랍니다 무엇을 할 수있다 카우 나는이 문제를 해결하기 위해 어느 방향으로 움직일 지 혼란 스럽기 때문에이 문제를 해결한다. 핵심 데이터 설명서의 변경 관리 섹션에서는 아무 것도 제공하지 않습니다. 같은 결과가 Google을주었습니다.

      감사합니다.

    답변

    0

    하지 마십시오. 감시자를보고있는 다른 사람을 보는 맥락은 ... 나쁘다. 먼저 중첩 된 컨텍스트의 규칙과 저장시 데이터를 서로간에 전달하는 방법을 이해해야합니다.

    나는 귀하의 경우 NSMOC에서 MR_confinementContext 메소드를 찾아 볼 수 있습니다. 이렇게하면 이전 스레드 제한 모델을 사용하는 컨텍스트가 만들어집니다.이것은 쓰레드 충돌을 피하는 데 도움이 될 수 있습니다. 하지만 먼저 순환 관측을하지 마십시오 ... 데이터 흐름은

    +0

    컨텍스트의 순환 관측을 제거했습니다. 현재는 지원을 변경하는 데 주력합니다. 그러나 이것은 도움이되지 않았습니다. 충돌은 여전히 ​​나타납니다. BTW 나는이 문제에 대한 몇 가지 해결 방법을 찾았습니다 : 내 컨텍스트 (주 및 지원)에 대해 모두 부모가 MR_rootSavingContext로 설정된 경우 모든 것이 올바르게 작동하기 시작합니다. 그러나 iCloud 지원도 필요하고 MR_defaultContext가 이에 책임이 있기 때문에 그것을 사용하는 것이 나를위한 solutiin이 아닌 것으로 보입니다. –

    +0

    또한 중첩 된 컨텍스트의 규칙 및 서로간에 데이터가 흐르는 방식을 지적 했으므로 일부 기사를 가리킬 수 있습니까? 구글 검색은 주로 코어 데이터 멀티 쓰레딩 문제와 관련된 기사를 제공합니다. –

    +0

    유감스럽게도 현재로서는 최고의 자료가 핵심 데이터에 대한 WWDC 비디오입니다. 기본 사과 개발자 계정을 통해 확인할 수 있습니다. 코어 데이터로 iCloud 지원을 피할 수도 있습니다. – casademora