2013-02-22 6 views
6

내 앱에는 이벤트 목록을 표시하는 UITableViewController이 있습니다. 이 컨트롤러는 ManagedObjectContext Say ParentContext을 사용합니다. 이제 어떤 이벤트라도 선택되면 사용자가 이벤트의 세부 사항을 편집 할 수있는 상세보기 컨트롤러가 표시됩니다. 코어 데이터 다단계 상위 - 하위 컨텍스트

NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    childContext.parentContext = self.context ; 

지금 다시 아래로 다른 드릴 필요 일부 필드와 관계가 있습니다 : 그래서 내가

ChildContext with type "NSPrivateQueueConcurrencyType"

ChildContext whose parent Context is "ParentContext".

내 코드는, 아이의 상황에 맞는 말을 만들었습니다. 그래서 나는

GrandChildContext with type "NSPrivateQueueConcurrencyType"

GrandChildContext whose parent context is "ChildContext"

이 프로세스 (아이) 부모 (있는 tableView에서 총 4 레벨) 다른 수준에 간다,라고 새로운 뷰 컨트롤러에 대한 또 다른 ChildContext을 만든

self.context - Parent Context 
    | 
    | 
ChildContext 
    | 
    | 
GrandChildContext 
    | 
    | 
GrandGrandChildContext 

내 사업체는 다음과 같이 표시됩니다.

EntityA   -- (Edit View Controller - uses ChildContext) 
| 
|- Field1 
| 
|- Field2 
| 
|- RelationShip (1 to Many) - (Relationship Add/Edit View Controller - uses GrandChildContext) 
    | 
    |- Field1 
    | . 
    | . 
    |- Field3 
    | 
    |- Relationship (1 to Many) - (Relationship Add/Edit View Controller - uses GrandGrandChildContext) 
      | 
      |- Field1 
      | 
      |- Field2 

이것은 부모 - 자녀 컨텍스트를 사용하는 올바른 방법입니까? 왜냐하면 어느 시점에 나는 1 NSMainQueueConcurrencyType MOC and 3 NSPrivateQueueConcurrencyType MOC과 같을 것이기 때문입니다.

그렇지 않으면? 다른 방법이 있습니까?

너무 많은 하위 컨텍스트가 앱 성능에 영향을 줍니까?

처음에는 사용자가 입력 한 데이터를 관리하기 위해 Properties 및 NSArrays를 사용했으며 사용자가 완료 버튼을 클릭하면 관리되는 개체를 업데이트/생성합니다. 그러나 이것은 지루한 작업으로 인해 내 View Controller가 더러워졌습니다. 그래서 부모/자식 컨텍스트로 전환하여 저장/저장을 쉽게 취소 할 수 있습니다.

감사

답변

4

당신은 약간의 자식 컨텍스트로 조금 밖에 빠져 나갔을 수도 있지만 조금만 접근하면 일반적인 접근 방식이 좋습니다. MOC (관리 객체 컨텍스트)는 상당히 가벼운 객체입니다.

각보기 컨트롤러/장면 내에서 해당 장면에 적용되는 MOC에 고유 한 참조가있는 방식이 마음에 듭니다.

MOC를 세션 또는 스크래치 패드로 생각하는 것이 도움이되는 경우가 있습니다. 매치업은 MOC와 엔티티 사이가 아니라 오히려 MOC와 논리적 작업 단위 사이에있다.

드릴 다운 중 하나가 사용자가 포기/취소하려는 일부 편집 작업의 시작을 표시하는 경우 하위 MOC를 스핀 오프하여 새보기로 전달하는 것이 좋습니다. 필요한 경우 롤백을 할 수 있습니다. 또는 MOC를 포기해도 시작 지점으로 되돌릴 수 있습니다.

정적 정보에 대한 뷰어 만 쓰고 있다면 MOC를 하나만 사용하십시오. 이 경우 더 많은 것을 사용할 필요가 없습니다.

+3

모든 드릴 다운에는 편집 작업이 있습니다. 나는 드릴 다운의 일부에서 몇 가지 저장/취소 작업을 줄였습니다. 이 모델로 얼마 동안 작업 한 후에 발견 된 유일한 문제는 생성 된 관계가 상위 하위에 표시되지 않는다는 것입니다. 이것은 ios 5에서만 발생합니다. 이것은 알려진 버그이며 자식 컨텍스트를 저장하기 직전에 obtainPermanentIDs를 호출하여 해결했습니다. – krishnan

+0

이 코멘트를 발견하고 obtainPermanentIDs 호출을 추가하기 전에 제 머리글 절반을 찢어 버렸습니다. –

-1

아마도 중첩 된 관리 객체의 상황에 가장 적합한 사용 사례에 대한 혼란이 소량 존재한다. 귀하의 경우에는 단일 컨텍스트 하나만 사용하는 것이 좋습니다.

배열 등에서 핵심 데이터로 이동하는 것은 매우 좋은 아이디어였습니다. 이제 개체 그래프의 진정한 힘과 단순성을 극대화하십시오. 일을 단순하게 유지하십시오.

드릴 다운하려면 하위보기 컨트롤러에 컨텍스트를 전달하십시오. 하위 뷰 컨트롤러가 가져온 결과 컨트롤러는 상위 뷰 컨트롤러와 동일한 컨텍스트를 사용할 수 있습니다. 수많은 Apple 코드 예제가이 패턴을 정확하게 사용합니다.

컨텍스트가 필요한 유일한 시간은 실제로 동시성이 필요한 경우입니다. 이것은 전혀 여기에 해당하지 않는 것 같습니다. 데이터가 검색되면 자식 뷰 컨트롤러의 새 인터페이스가 표시됩니다. 그 시간이 너무 오래 걸리는 경우 (데이터가 웹 서비스에서 왔기 때문에) 데이터 검색이 끝나면 일종의 "기다려주십시오"인터페이스를 표시하고 완전한 인터페이스를 표시합니다. 대부분이 시나리오는 아닙니다.

+5

[link] (https://developer.apple.com/videos/wwdc/2012/) wwdc 2012 비디오 핵심 데이터 모범 사례 세션 214를 보면 부모 및 자식 컨텍스트를 사용하여 세부 정보를 표시하는 방법을 보여줍니다 뷰 컨트롤러. 사용자가 save 버튼을 누르면 자식 컨텍스트를 저장할 수 있고 자식 컨텍스트의 모든 변경 사항이 부모 컨텍스트에 푸시되도록 동일한 기술을 사용하고 있습니다. 사용자가 취소 버튼을 누르면보기 컨트롤러가 닫히고 모든 변경 사항이 사라집니다. 여기 내 모든 하위보기 컨트롤러는 데이터를 편집하는 세부 관리자이며 가져온 결과 컨트롤러는 없습니다. – krishnan

+0

'[context save : nil]; 대신'[context rollback];을 사용하여 하나의 컨텍스트에서 동일한 결과를 얻을 수 있습니다. WWDC 비디오는 세부보기 컨트롤러의 가져 오기에 지나치게 많은 시간이 걸리는 경우 유용합니다. – Mundi

+0

내 질문을 이해할 수 없다고 생각합니다. 내 질문은이 [1] (http://stackoverflow.com/questions/10443754/undo-all-changes-made-in-the-child-view-controller)와 유사합니다. 하지만 제 경우에는 여러 수준의 하위 컨텍스트가 있습니다. '[컨텍스트 롤백]'을 사용하면 모든 변경 사항이 손실됩니다. 그러나 대신 나는 약간의 변화 만 버려지기를 바란다. 곧 샘플 프로젝트를 업로드하겠습니다. 감사합니다 – krishnan

관련 문제