2011-12-12 5 views
3

여러 개의 탭보기가있는 탭 컨트롤러를 사용하는 테스트 프로그램을 작성하고 있습니다. 이 프로그램은 여러 XML 파일을 다운로드하고 핵심 데이터를 통해 sqlite 테이블을 구문 분석하고 채 웁니다. 핵심 데이터 변수와 함수는 Xcode 생성 코드에 따라 App Delegate 파일에 있습니다. 나는 앱 위임에 초기화로 관리되는 개체 컨텍스트 공유

나는, 단순히 그것을 필요로 각각의 서브 뷰에 managedObjectContext 변수를 전달하여 예를 시작 :

FirstViewController *vc1; 
vc1 = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease]; 
[vc1 setManagedObjectContext:self.managedObjectContext]; 

는 그러나, 나는 전체를 삭제하는 기능 (resetData)가 데이터 저장소 - 영구 저장소 파일을 삭제하고 모든 핵심 데이터 변수 (managedObjectContext, managedObjectModel, persistentStore 등)를 nil로 설정하고 모든 것을 다시 초기화합니다. 이것은 프로그램이 처음부터 시작하여 네트워크의 모든 데이터를 다시 다운로드 할 수 있도록하기위한 것입니다. 이 경우, 서브 뷰는 이제 이전 managedObjectContext를 가리 킵니다.

모든 하위 뷰에서 managedObjectContext 변수를 업데이트하는 가장 좋은 방법은 무엇입니까? 수동으로 하위 데이터의 managedObjectContext 변수를 resetData 함수에서 업데이트 하시겠습니까? NSNotificationCenter를 사용하여 모든보기에 알림을 보내시겠습니까? 전체 영구 저장소 파일을 완전히 삭제하고 다시 초기화하는 중입니까?

내가 현재 단지 MOC를 참조해야 할 모든 클래스에서 앱 위임에 다시 의미이 게터를 뒀다

는 :

- (NSManagedObjectContext *)managedObjectContext { 
    MyAppDelegate* ad = (MyAppAppDelegate*)[[UIApplication sharedApplication] delegate]; 
    return [ad managedObjectContext]; 
} 

나는 코코아/아이폰 OS 디자인 재잘 아주 새로운 노력하고 있어요 이 일을하는 가장 적절한 방법을 찾아야합니다! 내가 지금 가지고있는 것은 작동하지만, 보이지 않는 함정이나 미래의 문제가 있는지 궁금합니다. 감사! CoreData

+0

"모든 영구 저장소 파일을 완전히 삭제하고 다시 초기화하고 있습니까?" 아마. 모든 물체를 제거 할 수 있을까요? – jrturton

+0

@jrturton 모든 개체를 제거하는 것은 확실히 가치가 있습니다. 그러나 그것들이 많으면 천천히 움직일 수 있습니다. CoreData는 데이터베이스가 아닙니다. – tonklon

+0

@tonklon - 확실한 것. 그러나 질문에서 우리는 얼마나 많은 물체가 있는지 알지 못합니다. 당신의 대답은 훌륭합니다. VC 스택을 다시 만드는 것은 길이다. – jrturton

답변

2

이럴 좋은 방법입니다. 테스트가 쉬워지고 재사용이 가능한 ViewController가 만들어집니다.

원하는 결과를 얻는 한 가지 방법은 CoreData Stack을 그대로두고 상점에서 모든 개체를 삭제하는 것입니다. 모든 뷰 컨트롤러는 이전과 같은 컨텍스트를 사용하지만 객체를 더 이상 포함하지 않습니다. 그러나 그것은 객체의 수에 따라 느려질 수 있습니다.

모든 개체를 삭제하는 가장 빠르고 효율적인 방법은 실제로 저장소 파일을 제거하는 것입니다. NSManagedObjectContext는 영구 저장소 코디네이터에 대한 설정자를 제공합니다. 새 파일로 새 storeCoordinator를 만들고 MOC의 storeCoordinator로 설정 한 다음 이전 코디네이터를 릴리스하고 이전 파일을 삭제하려고 했습니까? 모든 ViewController가 잠재적으로 보유한 managedObject를 릴리스해야하므로 알림을 보내야 할 수도 있습니다.

방금 ​​전에 생각해 보았던 또 다른 아이디어는 완전한 viewController 스택을 완전히 제거한 다음 새로운 managedObjectContext를 사용하여 다시 작성하는 것입니다. 새 데이터를 쉽게 다운로드하고 구문 분석하여 백그라운드에 별도의 managedObjectContext (자체 persistentStoreController 및 자체 스토어가 있음)로 저장할 수 있습니다. 그 작업이 끝나면 창에서 모든 컨트롤러를 제거하고 컨트롤러가있는 트랙을 확인하십시오. 그런 다음 새 저장소 파일을 이전 파일로 덮어 쓰고 이전과 같이 viewController 스택을 다시 작성하십시오. 비싼 수술처럼 들리지만 그렇지 않습니다. 제 경우에는 스위치가 UI에서 눈에 띄지 않았습니다. viewControllers를 유지하는 이점은 오래된 관리 대상 객체가 아직 어딘가에 숨어있어 추가 편집이 필요한 코드가 적다는 점입니다. viewController가 이미 설정되어있는 경우 Apple에서이 스위치가 "잘 작동합니다"라고하는 방법을 권장합니다.

+0

viewController 스택에 대한 흥미로운 아이디어 ... 나는 그것에 대해 조금 생각해야 할 것입니다! 감사 – Raolin

0

나는 보통 더 좋은 방법하지만 좋은 구현이 없습니다 Singleton 패턴을 사용합니다. 앱 대리인을 통해 항상 컨텍스트에 액세스하는 마지막 솔루션이 좋습니다. 이 경우 인스턴스 변수가 신택스 될 경우에는 사용할 수 없다는 것을 기억하십시오.

개체에 영구 데이터가 언제 다시 설정되어 새로운 컨텍스트를 사용하는지 알 필요가 있다고 가정합니다. 당신은 그것을 확인하기 위해 인스턴스 변수를 사용할 수 있습니다

@synthesize managedObjectContext = moc_ ; 

은 그럼 당신은 테스트 할 수 있습니다 다음 ViewControllers에 managedObjectContext를 통과

- (NSManagedObjectContext *)managedObjectContext { 
    MyAppDelegate* ad = (MyAppAppDelegate*)[[UIApplication sharedApplication] delegate]; 

    if(moc_ != [ad managedObjectContext]) { 
      // NEW CONTEXT. DO ANYTHING NEEDED TO RESET OBJECT 
    } 

    // Use property to change value to ensure set rules (retain for example). 
    [self setManagedObjectContext:[ad managedObjectContext]]; 

    return moc_; 
} 
관련 문제