2012-04-28 73 views
0

概述的iOS - 核心數據 - 完成處理

  • 我有一個使用核心數據
  • 核心數據由視圖控制器,以及用於通知

一個iOS的項目執行

  • 中創建爲數據庫活動單個類稱爲DatabaseEngine
  • 在的appDelegate didFinishLaunchingWithOptionsDatabaseEngine被實例化
  • DatabaseEngine包含視圖控制器和用於通知
  • 在視圖控制器的viewDidLoad我設置屬性(代表) DatabaseEngine委託給視圖控制器實例
  • 數據庫打開後,完成處理程序(通過委託屬性)調用方法來設置視圖控制器和通知

關注(時間問題)

  • 我擔心有可能是情景(計時問題),其中DatabaseEngine創建第一,在那一刻視圖控制器的viewDidLoad不會被執行,因此DatabaseEngine代表就沒有初始化,因此該數據庫將執行completionHandler但由於該委託是零,沒有任務就完成

我做了什麼,以解決合作ncern

  • 裏面的視圖控制器的viewDidLoad,我和檢查,如果數據庫已啓動,如果視圖控制器沒有裝載,如果是的話,我執行任務(建立視圖控制器的意見)一次。

注意 -我沒有使用明確,但根據我的理解completionHandler線程異步執行。

問題

  1. 我已經嘗試過幾次,視圖控制器數據是否正確,有似乎沒有計時問題。我甚至試圖通過一個較大的值循環(創建一個延時),並且仍然沒有時機的問題。我想知道爲什麼 ?
  2. 是我實現的一個很好的設計還是有更好的方式來做到這一點?
  3. 是正確的方式來解決我的顧慮?

回答

1

你的設計是有點令人費解,但似乎固體。(我傾向於使用應用程序委託來管理核心數據,但是如果您願意,也可以採用相同的方法。)

但是,我會使用通常的DatabaseEngine類的延遲初始化模式。通過這種方式,當它需要並且不存在時,它將創建自己並執行必要的初始化例程,而視圖控制器將等待直到對引擎的調用返回某些內容。

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

如果上下文沒有初始化,它會在這裏發生。

+0

非常感謝你!這是一個好主意,在managedObjectContext的存取器中做懶惰的實例化! – user1046037 2012-04-29 05:34:28

1

我認爲最好的方法也是讓您的應用程序委託管理數據。看起來像最好的方法,它是一個默認的CD應用程序模板。

我會考慮使用MagicalRecord,如果你問我,這是相當了不起的。使用MagicalRecord,您只需撥打[NSManagedObjectContext MR_defaultContext];即可獲得默認上下文。 MR也有免費的驚人類的方法,如

NSArray *array = [SomeObject findAll]

返回你所有的CD對象的數組。你甚至可以設置謂詞等,而且速度很快。

+0

感謝您的回覆!什麼是CD? – user1046037 2012-04-29 05:36:31

+0

對不起,CD是Core Data的簡稱。 – runmad 2012-05-01 18:00:12