2012-04-28 6 views
0

개요 완료 핸들러아이폰 OS - 코어 데이터 -

  • 나는이
  • 핵심 데이터 뷰 컨트롤러에 의해뿐만 아니라 통지

에 사용되는 핵심 데이터를 사용하는 아이폰 OS 프로젝트 구현

  • DatabaseEngine을 인스턴스화 DatabaseEngine AppDelegate에 didFinishLaunchingWithOptions에서
  • DatabaseEngine라는 데이터베이스 활동을위한 싱글 톤 클래스는 뷰 컨트롤러 내가 설정하고 통지 뷰 컨트롤러의 viewDidLoad에서
  • 의 속성 (위임)를 포함 Zoom_out 개월 DatabaseEngine보기 컨트롤러 인스턴스에 대한 위임
  • 데이터베이스가 열리면 완료 핸들러에서 대리자 속성을 통해보기 컨트롤러 및 알림을 설정하는 메서드를 호출합니다.

우려 (타이밍 문제)

  • 내가의 시나리오 DatabaseEngine 먼저 생성되고 그 순간에 뷰 컨트롤러의 viewDidLoad이 실행되지 않을 것이다 (타이밍 문제가)있을 수 있습니다 걱정하고, 그러므로 DatabaseEngine 위임 따라서 데이터베이스가 completionHandler을 실행하는 것입니다하지만 대리인이 전무하기 때문에, 어떤 작업이 수행되지 것입니다, 초기화하지 않을

나는 공동을 해결하기 위해 무슨 짓 뷰 컨트롤러의 viewDidLoad에 내부

  • ncern, 나는 데이터베이스가있는 경우 확인하고 오전 뷰 컨트롤러가로드되지 않은 경우, 그래 그럼 내가 다시 (뷰 컨트롤러의보기를 설정) 작업을 실행합니다.

참고 나는 스레드를 명시 적으로 사용하지 않고 있지만 completionHandler는 비동기 적으로 실행됩니다.

질문

  1. 나는 여러 번 시도하고 뷰 컨트롤러의 데이터가 제대로로드에는 타이밍 문제가없는 것으로 보인다. 나는 (지연을 만들기 위해) 큰 값으로 루핑을 시도했지만 여전히 타이밍 문제는 없다. 왜 그런지 궁금해?
  2. 구현이 좋은 디자인인가요 아니면 더 좋은 방법이 있습니까?
  3. 내 관심사를 해결하기위한 올바른 방법입니까?

답변

1

디자인이 약간 복잡하지만 견고한 모양입니다.(나는 애플 리케이션 델리게이트에 의해 관리되는 코어 데이터를 선호하지만, 당신이 선호한다면 당신의 접근 방식도 괜찮다.) 그러나, 나는 DatabaseEngine 클래스의 일반적인 초기화 패턴을 사용한다. 이런 방식으로, 필요할 때 실제로 존재하지 않을 때, 뷰 컨트롤러는 엔진 호출이 무언가를 리턴 할 때까지 기다릴 것이지만 필요한 자체 초기화 루틴을 생성합니다.

// in view controller viewDidLoad, e.g. 
self.managedObjectContext = [databaseEngine managedObjectContext]; 

컨텍스트가 초기화되지 않은 경우 여기에서 발생합니다.

+0

정말 고마워요 !! managedObjectContext 접근 자 내부에서 게으른 인스턴스화를 수행하는 것이 좋습니다. 답장을 보내 주셔서 감사합니다. – user1046037

1

제가 생각하는 가장 좋은 방법은 앱 위임자가 데이터를 관리하도록하는 것입니다. 가장 좋은 방법 인 것처럼 보입니다. 기본 CD 응용 프로그램 템플릿이하는 일입니다.

나는 magicalRecord를 사용하고 있는데, 나에게 묻는다면 꽤 놀랍다. MagicalRecord를 사용하면 [NSManagedObjectContext MR_defaultContext];을 호출하면 기본 컨텍스트를 얻을 수 있습니다. MR은 모든 CD 객체와 배열을 반환

NSArray *array = [SomeObject findAll]

같은 무료 놀라운 클래스 메소드가 있습니다. 술어 등을 설정할 수도 있고 꽤 빠릅니다.

+0

CD 란 무엇입니까? – user1046037

+0

죄송합니다. CD는 핵심 데이터의 약자입니다. – runmad