2010-02-25 63 views
0

我正在編寫一個遵循MVC設計模式的簡單應用程序。在Xcode項目我有三位:iPhone應用程序設計決策?

  1. 的AppDelegate
  2. 的ViewController
  3. 的DataModel

數據模型對象保存應用程序的所有數據,我想,以確保它被保存在應用程序退出並在應用程序啓動時重新加載。

我不確定這是否是正確的方法,我符合我的DataModel NSCoding並添加了encodeWithCoder:和initWithCoder:方法。我宣佈我的DataModel在我的viewController爲:

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

這是我的理解是,我需要保存和使用下面列出的AppDelegate的方法負載:

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

任何人都可以點我在正確的方向我應該怎麼做?我可以直接在相關對象中找到所有可以存檔(或取消存檔)數據的示例(請參見下文),我需要在應用程序啓動/退出時進行加載和保存。

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

任何幫助/信息非常感謝。

EDIT_001:

我剛纔檢查的書「開始的iPhone3發展」那裏是一個部分上achiving「第11章數據持久化」,他們做的東西,我還以爲會被糟糕的設計。在本書中,他們將他們的數據模型與[NSCoding]一致,並實現編碼/解碼的方法。然後,他們在viewController中使用viewDidLoad:和applicationWillTerminate:在適當的時候取消/實現。我發現不好的是他們從UITextFields獲取數據?我有我希望存儲的數據,這些數據在用戶界面上沒有顯示,因此在我的情況下不起作用。你也不應該從dataModel存檔/取消存取,而不是通過UI控件查看視圖?

EDIT_002:

越來越近了,現在看起來你做到以下幾點:(無論是在的viewController)

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

注:applicationWillTerminate使用NSNotification而不是UIApplication的,再加上你還需要添加以下代碼放在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 2010-02-25 16:13:09