2012-04-01 200 views
5

我有一個同步openWithCompletionHandler:(UIManagedDocument)與主要活動的基本問題。iOS5.1:同步任務(等待完成)

情況: 我有一個管理共享UIManagedDocument的單例類。此類提供了一種方法,該方法應該以正常狀態(即創建或打開它,無論什麼是必需的)傳遞文檔。 但是因爲openWithCompletionHandler:在後臺異步執行它的主要工作,所以我的程序應該等待設置fetchedResultsController,直到文檔真正打開。當數據庫沒有準備好時,「viewWillAppear」方法(當前)不會產生有用的輸出。 等待會對我好,但得到通知可能是更好的方法。也許viewWillAppear結果不是正確的點setupFetchedResultsController,因爲沒有在runloop調用。

有沒有一個標準模式來實現這一目標?

更多的背景(不是我認爲如此重要) 我正在研究一個涉及CoreData UIManagedDocument的小型iOS 5.1應用程序。 我喜歡去年秋天在iTunes-U上的斯坦福大學課程第14課的例子。一切工作正常,直到我試圖將UIManagedDocument的處理從UITableViewController類轉換爲處理我的文檔的單獨類。 在原始版本中,FetchedResultsController在完成處理程序中設置。

回答

3

我建議以下Justin Driscoll的優秀帖子Core Data with a Single Shared UIManagedDocument

您將在UIManagedDocument單例中找到完整的文章,並在performWithDocument上找到示例。您的fetchedResultsController設置代碼應該放在performWithDocument:^ {}塊中。

另請注意,openWithCompletionHandler不是線程安全的 - 在打開文檔時同時調用performWithDocument會導致崩潰。對我來說這個解決方案不是微不足道的(而且非常適用於特定應用),所以如果遇到同樣的問題,我建議您查看UIDocumentStateChangedNotification,它可以通知文檔狀態更改,並且可以作爲多個文檔開啓者的同步點。

一些片段,如果你有興趣,

首先在MYDocumentHandler的初始化,設置在最後一個額外的通知:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(documentStateDidChange:) 
               name:UIDocumentStateChangedNotification 
               object:self.document]; 

然後在performWithDocument,@synchronized(self.document)在關鍵的開放/創建節以確保一次只有一個線程進入,並阻止進一步的線程,直到打開/創建成功。

最後添加以下功能:

- (void)documentStateDidChange:(NSNotification *)notification 
{ 
    if (self.document.documentState == UIDocumentStateNormal) 
     @synchronized (self.document) { 
      ... unblock other document openers ... 
     } 
} 

至於塊/解鎖線程,因人而異。我使用dispatch_semaphore_t以及一些dispatch_queues來滿足應用程序特定的需求。你的情況可能像等待完成或放棄其他線程一樣簡單。