2012-09-25 35 views
2

我正在使用核心數據,並想知道我是否正確地做事情。我打開我的UIManagedDocument從單身物件使用完成處理程序和下面。UIManagedDocument CompletionHandler&NSNotification

[[self managedDocument] openWithCompletionHandler:^(BOOL success) { 
      if(success) { 
       NSLog(@"DOCUMENT: Success, Opened ..."); 
       // TODO: Things to do when open. 
       // ... 
       // ... 
      } 
}]; 

在我UIViewController我有安裝觀察員觀看了UIDocumentStateChangedNotification表明,我就可以開始與文檔工作。

- (void)awakeFromNib { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
    [notificationCenter addObserver:self selector:@selector(documentIsReady) name:UIDocumentStateChangedNotification object:nil]; 
} 

這接縫工作得很好,但我意識到,我不使用回調。一種解決方案可能是創建我自己的通知並從發佈它,它本質上做了同樣的事情,但只是使代碼更易於閱讀。任何意見將不勝感激。

回答

2

我想說,如果你只需要通知一個控制器,一次,並且只有當文檔被打開時(你有一個應用程序使用一個單一的UIManagedDocument在控制器之間傳遞,如CS193P演示),它最好只在完成塊內留下代碼。

但是,如果您的應用程序要打開和關閉文檔多次,並且多個控制器必須知道該更改,則應該使用通知。

+0

我確實有多個控制器都使用NSFetchedResultsControllers和UITableViews,但是他們都做同樣的UIManagedDocument訪問。我的問題是,我在每個控制器上設置了不同的NSFetchResultsControllers,所以我需要進行通信,然後文檔已準備就緒,這樣我就可以執行我的初始抓取,特別是在「初始控制器」上,因爲在託管文檔實際上已準備就緒使用。 – fuzzygoat

+0

我的應用類似。我有大約6個不同的UITableViews,每個人都設置它自己的NSFetchedResultsController。第一個控制器創建並打開UIManagedDocument,並將其保留在其某個屬性中。之後每個控制器都被賦予一個NSManagedObject(他們將需要創建謂詞)的副本,並使用它來設置他們自己的NSFetchedResultsController。由於其他控制器不能訪問,除非文檔打開並且第一個控制器中的tableview加載了它的數據,我不必擔心通知它們。 –

+0

Mine幾乎是一樣的,唯一的區別是UIManagedDocument是在從AppDelegate實例化的單例中創建的。我本可以把它放在AppDelegate中,但我還有一些其他的東西我想保持分開。感謝您的幫助,非常感謝。 – fuzzygoat