2010-02-25 7 views
0

MVC 디자인 패턴을 따르는 간단한 애플리케이션을 작성했습니다. 엑스 코드 프로젝트에서 나는 3 비트가 :아이폰 애플리케이션 디자인 결정?

  1. AppDelegate에
  2. 의 ViewController를
  3. DataModel이

DataModel이 객체는 응용 프로그램에 대한 모든 데이터를 보유하고 나는 그것이에 저장되어 있는지 확인하려면 app-exit에서 재로드하고 app-startup에서 다시로드합니다.

이것이 올바른 방법인지 확실치 않습니다. DataModel에 NSCoding을 적용하고 encodeWithCoder : 및 initWithCoder : 메서드를 추가했습니다.

FlowerStore *flowerStore = [[FlowerStore alloc] init]; 

그것은 내가 저장 및로드 아래에 나열된 AppDelegate에 방법을 사용 할 필요가 나의 이해는 다음과 같습니다 :

-(void)applicationDidFinishLaunching:(UIApplication *)application { // LOAD 
-(void)applicationWillTerminate:(UIApplication *)application { // SAVE 

사람이 올바른 방향으로 날 지점 수 나는 나의의 ViewController 내 DataModel이를 선언 한 어떻게 내가이 일을해야 할까? 관련 예제 내에서 데이터를 직접 아카이브 (또는 보관) 할 수있는 모든 예제 (아래 참조). 앱을 시작하거나 종료 할 때로드 및 저장이 필요한 위치는 어디입니까?

-(void)encodeWithCoder:(NSCoder *)encoder { 
-(id)initWithCoder:(NSCoder *)decoder { 

도움/정보를 제공해 주셔서 감사합니다.

EDIT_001

: 난 그냥 "제 11 장 데이터 지속성을"achiving에 섹션을이 책을 "시작 iPhone3 개발"에서 확인하고 그들은 내가하고 나쁜 디자인을했을 생각을했을 일을 할

. 책에서 그들은 dataModel을 [NSCoding]에 맞추고 인코딩/디코딩 할 메소드를 구현합니다. 그런 다음 viewController에서 viewDidLoad : 및 applicationWillTerminate :를 사용하여 적절한 시간에 도달/달성하지 못하게합니다. 내가 잘못 찾은 것은 UITextField에서 데이터를 가져 오는 것입니까? 내 경우에는 작동하지 않을 UI에 표시되지 않는 저장하려는 데이터가 있습니다. 또한 UI 컨트롤을 통해보기를 보지 않고 dataModel에서 보관/보관하지 않아야합니까? applicationWillTerminate가 NSNotification하지 UIApplication을 사용, 플러스 당신은 또한 추가해야합니다

EDIT_002 : (모두의 ViewController에서)

-(void)viewDidLoad { // LOAD 
-(void)applicationWillTerminate:(NSNotification *)notification { // SAVE 

참고 :

가까이 얻기는, 지금 당신이 다음을 수행 같습니다 다음 코드는 viewDidLoad의 맨 아래에 있습니다.

UIApplication *app = [UIApplication sharedApplication]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(applicationWillTerminate:) 
              name:UIApplicationWillTerminateNotification 
              object:app]; 

게리

답변

1

나는 그것을 선호 사항으로 본다.어떤 시점에서 저장 /로드를위한 모델 메소드를 호출해야합니다.이 방법을 사용하면 몇 가지 해결책을 찾을 수 있습니다. 지금 구축중인 프로젝트에서 사용자가 "주제"영역을 입력/종료 할 때만 특정 데이터를로드/저장하려고합니다. 너무 느린 경우 "applicationDidFinishLaunching"에서 호출되는 별도의 스레드를 사용해야하는 일부 데이터로드를 수행 할 가능성이 큽니다. 그런 다음 버튼/tablecellselection을 클릭하면 스레드 완료를 확인합니다.

개인적으로 대부분의 모델 변수 (내부)와 복잡성을 숨기려면 "래퍼"메소드를로드하고 저장 한 다음 이러한 래퍼가 단순히 성공/실패 및 데이터에 ptr을 반환하도록하십시오.

0

예, 아래 applicationDidFinishLaunching : 및 applicationWillTerminate는 : /로드 당신의 영속 데이터를 저장하기 좋은 장소입니다.

로드해야 할 데이터가 많고 응용 프로그램로드 시간이 느린 경우 걱정할 필요가없는 상황에서로드하는 더 정교한 전략을 고려할 수 있습니다 (CoreData를 사용하고자 할 때).

+0

모델에서 저장 /로드 중입니까? 나는 컨트롤러에서 모델 메서드를 사용하고 선언하고 있다는 것에 조금 혼란 스럽다. 하지만 appDelegate에서 작동하는 방법을 잘 모르겠습니다. applicationDidFinishLaunching : 및 applicationWillTerminate :는 무엇입니까? – fuzzygoat

관련 문제