2010-08-09 2 views
2

핵심 데이터 탭 기반 iPad 응용 프로그램을 작성하고 있습니다. 내 NSManagedObjectContext에서 내 응용 프로그램 대리자 클래스에서 다음을 사용하여 루트보기로 전달합니다.NSManagedObjectContext 및 iphone/ipad 탭간에 다른 서비스 클래스를 공유합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    self.rootViewController.managedObjectContext = self.managedObjectContext; 
    [window addSubview:tabBarController.view]; 
    [window makeKeyAndVisible]; 

    return YES;  
} 

내 질문 : 모든 내 탭에서 동일한 managedObjectContext를 설정하려면 어떻게해야합니까? 또한 앱 델리게이트에서 일부 서비스 클래스를 설정하고 모든 탭에서 동일한 인스턴스를 사용할 수 있다면 좋을 것입니다. 어떻게 할 수 있습니까?

미리 감사드립니다.

답변

4

"탭"은 단순히 다른보기 컨트롤러입니다. 각 탭에 대해 VC를 시작하면 managedObjectContext 속성이 있다고 가정하고 rootviewController.managedObjectContext를 설정하는 것과 동일한 방식으로 관리 대상 객체 컨텍스트를 전달할 수 있습니다.

어떤 사람들은 싱글 톤 객체를 사용하여 클래스에 코어 데이터 객체를 제공합니다. 내가 현재하고있는 응용 프로그램에서 수행 한 작업은 내 NSManagedObjectContext, NSManagedObjectModel 및 NSPersistentStoreCoordinator에 대한 getters를 사용하여 CoreDataSource 프로토콜을 선언하고 해당 appDelegate에서 해당 프로토콜을 구현 한 것입니다. 핵심 데이터를 사용해야하는 내보기 컨트롤러에는 NSObject <CoreDataSource> 유형의 멤버 변수가 있고 서로를 만들 때 속성을 설정합니다. 그들은 모두 실제로 appDelegate를 가리키고 있지만, 그것을 모르기 때문에 업스트림 객체와 밀접하게 연결되어 있지 않습니다. 그들은 모두 자동으로 찾을 모든 탭보기 컨트롤러는이 방법을 상속하는 경우

- (NSManagedObjectContext *) managedObjectContext{ 
    if (managedObjectContext !=nil) { 
     return managedObjectContext; 
    } 
    MyAppDelegateClass *appDelegate=(MyAppDelegateClass *)[[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext=appDelegate.managedObjectContext; 
    return managedObjectContext; 
} 

:

+0

각 탭마다 각 VC가 초기화되는 방법/위치를 볼 수 없습니다. 탭을 추가하려면 탭 컨트롤러 아래에 다른 것을 추가하고 VC를 가리 키십시오. –

+0

당신은 자신의 init이 필요 없기 때문에 AppDelegate의'-applicationDidFinishLaunching ... '메소드에서 처리 할 수 ​​있습니다. 'UITabbarController'를 잡고'-viewControllers'를 반복합니다. –

+0

Marcus - 예, 응용 프로그램에서 의미가 있었습니까? DadFinishLaunching - 탭 컨트롤러를 사용하면 수동으로 탭을 만들고 추가했습니다. 어느 쪽이든, 나는 이것이 DI를위한 올바른 장소라는 것에 동의합니다. –

2

가장 간단한 해결책은 managedObjectContext 속성과 같은 사용자 정의 getter 메소드와 함께 사용하면 탭보기 컨트롤러의 슈퍼 클래스를 추가하는 것입니다 앱 대리인의 관리 객체 컨텍스트 그리고 너 끝났어.

+1

우리는 여전히 Singletons의 사용에 동의하지 않습니다. 응용 프로그램이 시작될 때 종속성 주입이 더 나은 해결책이라는 것을 알았습니다. –

+0

@Marcus S. Zarra - 의존성 주입이 더 좋을 수도 있지만 초보자가 구현하는 것이 더 간단하지는 않습니다. 초보자는 뷰 컨트롤러 계층 구조를 추적하는 데 어려움이 있으며 특히 탭 막대의 경우이 문제를 해결할 수 있습니다. – TechZen

+0

나는 항상 처음부터 끝까지 치는 팬이었습니다. –

관련 문제