주로 개발자 용으로 내 기본 응용 프로그램에 몇 가지 기본 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
을 사용하고 있습니다. 필자가 본 다른 곳에서도 저축이 컨텍스트 컨텐츠를 계층 구조를 통해 밀어 넣기에 충분해야한다고 언급 했음에도 불구하고. 저장은 하위 -> 부모에서만 작동하고 부모 -> 하위에서는 작동하지 않습니다.
아니면 그냥 잘못하고 있습니까?
누구나 시간과 도움을 정말 감사드립니다! 건배.
답변 해 주셔서 감사합니다. 나는 직장에있는 동안 방금 그것을 훑어 보았습니다. 궁금한 점은 UIManagedDocuments와 관련이없는 MOC에 관한 것입니다. 여기에 또 다른 질문이 있습니다. http://stackoverflow.com/questions/11350670/uimanageddocument-with-nsfetchedresultscontroller-and-background-context "Apple은 관리되는 문서를 사용할 때 context-save를 지원하지 않습니다. 영구 ID를 얻은 후에 [document updateChangeCount : UIDocumentChangeDone]을 호출해야합니다. " 아마도 UIManagedDocuments가 더 복잡한 작업을 수행합니까? – jimbobuk