0

주로 개발자 용으로 내 기본 응용 프로그램에 몇 가지 기본 UIManagedDocument 가져 오기/내보내기 기능을 구현하려고합니다. CoreData 모델을 반복 할 때 테스트 데이터 세트를 더 중요하게 보존해야합니다.UIManagedDocument 상위 우선 순위 큐에 대한 부모 컨텍스트 개체 삽입이 하위 컨텍스트를 사용하는 UI에서 업데이트되지 않음

내가하려는 것은 로컬 파일에서 JSON 데이터를로드하고이를 내 애플 리케이션 UIManagedDocument에 삽입하는 것이다. UIManagedDocument의 ManagedObjectContext 내용은 스탠포드 iOS 과정의 일부 핵심 데이터 테이블 뷰 컨트롤러를 사용하여 내 응용 프로그램에서 시각화됩니다.

나는 UI 응답 성을 유지하고이를 수행하는 방법을 배우기 위해 일부 스레딩을 사용하여 이것을 작성하려고 노력할 것이라고 생각했습니다. 그래서 나는 이런 식으로했습니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    // read JSON data file 
    // parse JSON into dictionaries etc 
    // iterate over dictionaries 
    // try to create a new core data entity with my document's ManagedObjectContext 
}); 

처음에는 이것이 작동하고 있다고 생각했습니다. 오류, 주장, 크래시가 발생하지 않고 내 CoreData TableViews를 볼 때 새로 추가 된 객체가 UI에 표시됩니다. 불행히도 새로 추가 된 객체는 겉으로보기에는 저장되지 않았습니다. 나는 심지어 내 UIDocument의 managedObjectContext에서 NSManagedObjectContextDidSaveNotification을 청취하기 위해 연결했고 홈 버튼을 눌렀을 때 트리거하지 않는 것을 보았다. 내 UI 보류 상태로 앱에서 수행 된 변경 사항이있는 경우 일반적으로 발생했다. 실제로 UI에서 이러한 작업을 수행해도 알림 및 저장이 발생하지 않으므로 분명히 만족스럽지 않습니다.

배경 대기열에서 코드를 풀어서 주 스레드에서 동기식으로 실행하고 모든 것이 정상적으로 실행되면 새 데이터가 올바르게 저장됩니다.

내가 스레딩 및 coredata의 복잡성에 대해 읽기 시작, 문서는

를 다음과 같이 그래서 나는이 부모 컨텍스트를 사용하여 다시 동일한 코드를 일을 시도 있도록 백그라운드에서 작업을 수행하기 위해 UIDocument의 ManagedObjectContext의 부모 ManagedObjectContext을 사용하는 것이 좋습니다 듯
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    // read JSON data file 
    // parse JSON into dictionaries etc 
    // iterate over dictionaries 
    // try to create a new core data entity with my document's ManagedObjectContext parent ManagedObjectContext 
}); 

이번에는 CoreData TableView 컨트롤러가 더 이상 새로 삽입 된 개체를 표시하도록 업데이트되지 않았습니다. 부모 컨텍스트에서 명시 적으로 save를 호출 한 후에도 아무 것도 나타나지 않습니다. 그러나 응용 프로그램을 종료하고 새로로드 된 응용 프로그램을 다시로드 할 때 올바르게 추가 된 것 같습니다. 흥미롭게도이 시점에서 나는 cachename이 지정된 fetchrequest를 남겨 두었고,이 방법으로 객체를 주입 한 후에 앱의 첫 번째 실행에서 오류를 던졌다. 어떻게 든 개체가 부모 컨텍스트에서 직접 어딘가에 캐시를 무효화했는지 어떻게 여겨지 던지 짐작합니다. 여전히 완전히 이해하지 못하는 것입니다. 심지어 캐시를 nil로 변경해도 개체가 부모 컨텍스트에 주입되었을 때와 동일한 세션으로 업데이트되지 않는 테이블 뷰의 문제가 수정되지 않았습니다.

다른 곳에서는 managedObjectContext performBlock을 일부 사용하는 것을 보았습니다. 누군가가 구원을 보장하기 위해 모든 변경 후

[document updateChangeCount:UIDocumentChangeDone] 

를 호출 할 필요가 말했다 또 다른 경우는 수행, 혹은 대신

- (void)autosaveWithCompletionHandler:(void (^)(BOOL success))completionHandler 

을 사용하고 있습니다. 필자가 본 다른 곳에서도 저축이 컨텍스트 컨텐츠를 계층 구조를 통해 밀어 넣기에 충분해야한다고 언급 했음에도 불구하고. 저장은 하위 -> 부모에서만 작동하고 부모 -> 하위에서는 작동하지 않습니다.

아니면 그냥 잘못하고 있습니까?

누구나 시간과 도움을 정말 감사드립니다! 건배.

답변

0

나는 비슷한 문제를 찾을 수있는 모든 제안에보고 한 후, 그들 중 누구도 도울 것 같았다.

결국 내가 처리 한 시나리오는 ok 파일을 처리하지만 UI는 업데이트되지 않습니다. 이 가져 오기/내보내기를 할 때 나는이 모든 JSON 개체를 삽입 할 때 업데이트되지 않는 핵심 데이터 테이블보기 컨트롤러의보기 ontop에 있습니다. 그래서 결국 컨트롤러를 다시 강제 실행했습니다. - 데이터 가져 오기. NSFetchedResultsController는 managedObjectContext를 모니터링하고 필요에 따라 인출 요청을 업데이트하기위한 것입니다. 어떤 이유로 든 이것이 효과가 없었습니다.

힘을 다시 불러 오면 모든 것이 정상적으로 작동하는 것처럼 보입니다. 새로 삽입 된 엔티티가 내 테이블에 나타나고 저장소 파일에 저장됩니다.

이 개체에 몇 가지 버그가 있거나 여전히 잘못 사용하고 있지만 다른 문제가 나타납니다 ... 가져 오기/내보내기 데이터가 모두 부모 컨텍스트가있는 백그라운드 스레드에서 작동합니다. 오늘 제가 알아챈 점은 UI를 사용하여 주 스레드에서 하위 컨텍스트를 사용하여 일부 개체를 올바르게 삽입하고 편집 할 수 있다는 것입니다. 나는이 편집을 한 후에 의도적으로 아무 것도 부르지 않고 핵심 데이터가 저장하기로 결정할 때까지 편집 내용이 아직 보류 중입니다. 그런 다음 내 내보내기 기능으로 이동하여 부모 컨텍스트를 사용하여 사용하면 새로 편집되거나 삽입 된 개체가 없습니다.

자식 -> 부모로부터 메시징이 발생하지 않았으며 부모 스레드의 백그라운드 스레드 편집 메시지가 작동하지 않는 것 같습니다. 스레드에서 수행하는 편집에 대한 알림을받지 못했습니다. 부모 컨텍스트에서 작동하는 것처럼 보이지만 문서를 통해 저장이 강제 실행되면 사전에 전달 된 편집 내용은 수정 내용이 어떻게 든 저장 파일에 올바르게 저장 되더라도 편집이 수행되지 않은 것으로 표시됩니다.

나는 이제 모든 작업 후에 또는 적어도 부모/자식이 동기화되어 있는지 확인하기 위해 다른 스레드에서 수행하려고하는 모든 작업 전에 내 문서를 저장해야 할 필요가 있다고 생각합니다.

여전히 원래 문제는 해결할 수 있었지만 여전히 이러한 문제가 발생하지 않도록 UIManagedDocument의 부모 및 자식 컨텍스트를 어떻게 사용해야하는지 궁금합니다.

0

Multi-Context CoreData의 '부모/자녀 컨텍스트'섹션을 확인하십시오.

부모 MOC가 부모에게 이러한 변경 사항을 알릴 때마다 페치 된 결과 컨트롤러에 이러한 변경 사항에 대한 정보가 제공됩니다. 그러나 배경 MOC가 PSC에 대해 알지 못하기 때문에이 데이터는 유지되지 않습니다. 디스크에 데이터를 얻으려면 주 큐 MOC에 추가 saveContext :가 필요합니다. 나는 방법 다음 PSC에 저장 N 않는

:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
{ 
    // read JSON data file 
    // parse JSON into dictionaries etc 
    // iterate over dictionaries 

    NSError* error; 
    if (self.managedObjectContext.hasChanges) 
    { 
     [self.managedObjectContext save: &error]; 
    } 

    // Save main context 
    dispatch_sync(dispatch_get_main_queue(),^
    { 
     [[AXContextHelper sharedInstance] saveMainContext]; 
    }); 
} 
+0

답변 해 주셔서 감사합니다. 나는 직장에있는 동안 방금 그것을 훑어 보았습니다. 궁금한 점은 UIManagedDocuments와 관련이없는 MOC에 관한 것입니다. 여기에 또 다른 질문이 있습니다. http://stackoverflow.com/questions/11350670/uimanageddocument-with-nsfetchedresultscontroller-and-background-context "Apple은 관리되는 문서를 사용할 때 context-save를 지원하지 않습니다. 영구 ID를 얻은 후에 [document updateChangeCount : UIDocumentChangeDone]을 호출해야합니다. " 아마도 UIManagedDocuments가 더 복잡한 작업을 수행합니까? – jimbobuk