2009-12-01 3 views
2

NSManagedObjects를보고, 편집하고, 만들 때 NSManagedObjectContexts를 사용하는 적절한 방법을 알아 내려고하고 있습니다. 설명서 및 예제에서는 가장 기본적인 경우에 설명서를 사용하는 방법을 설명했지만 약간 복잡한 설정에서는 적절한 방법이 무엇인지 잘 모르겠습니다.새 객체 (iPhone)를 편집/생성 할 때 NSManagedObjectContexts의 올바른 사용법은 무엇입니까?

셋업 :

  • 3 메인 화면 : 객체의 목록, 편집 객체 화면, 새로운 객체 화면.
  • 다른 스레드가 백그라운드에서 목록에 추가 할 개체를 다운로드 중입니다.

요구 사항 :

  • 목록 화면이 모든 그것의 객체를 얻기 위해 MOC와 NSFetchedResultsController를 사용합니다.
  • 편집 및 새 객체 화면은 MOC를 사용하여 객체를 저장/삭제하고 관계에 NSFetchedResultsController를 사용합니다.
  • 다운로드 된 개체는 개체를 Core Data (주 스레드)에 저장하려면 MOC가 필요합니다.

질문 :

  • 내가 얼마나 많은 MOCS 필요합니까?
  • 어떻게 이러한 MOC를 조작해야합니까?

가능한 답변 :

  • 편집되지 않습니다 및 목록 화면에서 사용되는 하나의 "보기"MOC 되세요. 편집, 새로운 객체 화면 및 다운로드에 별도의 MOC를 사용하십시오. 이러한 MOC가 저장되면 변경 사항을 다시 "View"MOC에 병합하십시오. 이렇게하면 모든 변경 사항이 저장 될 때까지 "보기"MOC에 영향을 미치지 않습니다. 이것이 내가 한 일이다. 그것은 내가 원하는만큼 부드럽게 작동하지 않는 것 같습니다. 편집과보기 사이의 연결이 끊어지며 변경된 사항을 알았을 때 상황을 확인할 수있는 대신 NSFetchedResultsController 대리자 메서드가 완료 될 때까지 기다렸다가 변경된 모든 가능한 항목을 확인해야합니다. 또한 목록보기에서 일부 데이터를 변경해야하는 경우 어려워집니다.

  • 모든 것에 대해 하나의 MOC가 있어야합니다. 이것은 내가 처음 시도했지만 편집과 생성을 다루는 방법에 대해 확신하지 못했습니다. 이제는 조금 더 이해 했으므로 개체를 편집하거나 개체를 만들고 취소시 rollBack을 만들 수 있습니다. cimgf에서 나는 편집/생성과 취소시 undo을 취소 할 것을 말한 비슷한 것으로 보이는 post을 보았습니다. 그런 다음 사용자가 주 MOC에서 편집하는 동안 완료되고 저장 될 수 있기 때문에 다운로드 한 객체에 별도의 MOC를 사용할 수 있다고 생각합니다.

  • 어쨌든 요점은 적절한 방법이 무엇인지 모르겠다는 것입니다. 너 나 좀 도와 줄 수있어?대상 (1) 편집 MOC에서 만든 첫 번째 가능한 대답

    1. 에 대한

예를 분리합니다. 저장 됨. 알림으로 뷰 moc와 병합되었습니다.

  • 백그라운드에서 개체를 다운로드 중이므로 새로운 Moc가 만들어졌습니다. (1)과 관련된 일부 개체를 업데이트했습니다. 저장 됨. 알림으로 뷰 moc와 병합되었습니다.
  • 편집 moc에서 편집 (1) 저장 됨. 알림으로 뷰 moc와 병합되었습니다.
  • 문제 : 편집 moc가 새로운 moc 변경 사항을 얻지 못했기 때문에 저장시 변경 사항에 영향을받는 모든 새로운 moc 변경 사항이 삭제됩니다.
  • 해결 방법 : 변경 사항을 편집 moc에 병합하거나 항상 새로운 moc을 사용하여 편집 할 수 있음을 알고 있습니다. 그러나 나는 이와 같은 작은 일들을 계속 실행하고 해결책을 찾아야하므로 이것이 최선의 해결책이 아니라고 생각합니다.
  • 답변

    2

    스레드 당 최소 하나의 MOC가 있어야합니다 (스레드로부터 안전하지 않습니다). 그래서 당신은 백그라운드 스레드에서 다운로더를위한 MOC를 가질 수 있었고 메인 스레드 목록의 편집과 새로운 활동을 위해 다른 것을 가질 수있었습니다.

    연결이 끊어 졌다고 말하면 더 구체적으로 설명 할 수 있습니까? 해당 알림을 받으면 알림 (NSManagedObjectContextDidSaveNotification)을 사용하고 mergeChangesFromContextDidSaveNotification을 수행하고 있습니까? 기억하십시오. mergeChangesFromContextDidSaveNotification은 메인 스레드에서 수행되어야합니다.

    NSFectchedResultsController의보기 컨트롤러에서 NSFetchedResultsControllerDelegate의 모든 사례를 올바르게 처리하고 있습니까?

    +0

    답장을 보내 주셔서 감사합니다. 예, 알림을 사용하여 기본 스레드의보기 moc를 업데이트하고 있습니다. 예, NSFetchedResultsControllerDelegate 사례를 올바르게 처리하고 있습니다. 질문에 단절의 예를 추가했습니다. 지금까지이 방법이 가장 좋은 해결책 인 것 같습니다. - 할 수있는 한 1moc를 사용하십시오. - 주 moc을 사용할 수없는 경우 매번 * 새 항목을 만드십시오 * 다른 곳에서 변경 한 내용을 저장하지 않으려면 항목을 변경해야합니다. 또는 가능한 경우 해당 moc에 변경 사항을 병합하십시오. - 주 메뉴 이외의 모든 메뉴는 변경 사항을 주 메뉴에 병합해야합니다. 찾았습니까? – jasongregori

    +0

    그런 것. 나는 NSFetchedResultController에 의해 사용 된 메인 moc를 가졌다. 백그라운드 작업 (NSOperations에 패키지 됨)에는 자체 moc가있었습니다. 해당 mocs에서 이루어진 모든 변경 사항은 알림을 사용하여 주 moc에 전달되고 병합되었습니다. 그래서 본질적으로 주 moc는 읽기 전용이었습니다. 이 물건은 까다 롭고 그것을 올바르게 얻는 데 시간이 걸립니다. 많은 시행 착오. – lyonanderson

    관련 문제