2012-05-26 74 views
0

我已經指定了NSFetchtedResultsController財產...NSFetchedResultsController的didChangeObject不叫

@property (nonatomic, strong) NSFetchedResultsController *controller; 

...並設置委託給我的課。

self.controller.delegate = self; 

然後,我已經實現了在標題中提到的方法,並在其中放置了一個斷點。

- (void)controller:(NSFetchedResultsController *)controller 
       didChangeObject:(id)anObject 
       atIndexPath:(NSIndexPath *)indexPath 
       forChangeType:(NSFetchedResultsChangeType)type 
       newIndexPath:(NSIndexPath *)newIndexPath 
    {  

    => BREAKPOINT <= 

    } 

我已經創建用於控制器獲取請求如下:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"]; 
    // ... some sort ... 
    self.controller = [[NSFetchedResultsController alloc] 
         initWithFetchRequest:fetchRequest 
         managedObjectContext:self.context 
         sectionNameKeyPath:nil 
         cacheName:@"cache"]; 

現在我存儲在相同的上下文另一個類類型「後」的一些NSManagedObjects但didChangeObject方法從來沒有被稱爲(我的斷點在其中)。

有誰知道發生了什麼問題?

更新#1:從服務器獲取一些帖子並將其存儲到上下文中的類使用GCD異步執行。

更新#2:我以另一種方式嘗試過,因爲它無法在多線程環境中使用上下文。 (感謝svena) 現在ServerConnection運行在異步模塊(使用GCD)並在主線程上執行一個選擇器。這個選擇器方法將帖子存儲在數據庫中,並且應該更新tableview。基本上,我認爲當我在這種情況下存儲的東西時,應該自動調用didChangeObject方法?但事實並非如此。 : -/

我添加了一個簡短的序列圖來說明我目前的狀態。 sample sequence diagram 有誰知道爲什麼這不起作用?請耐心等待。我是CoreData和Objective-C的新手。 :)

+0

你有沒有在你的控制器上調用performFetch: – rdelmar

+0

@rdelmar當然是。忘了複製行。它直接在控制器的實例化之後。 ('[self.controller performFetch:&error];') – Chris

+0

數據被正確提取。我將顯示CoreData中的數據,並調用從服務器獲取新結果並將其存儲到此數據庫的方法。每當將新結果插入到CoreData DB(列「Post」)時,我想要在ViewController中獲取通知(didChangeObject事件),以逐行顯示每一行。這應該模擬連續加載。 – Chris

回答

1

更新#1:從服務器獲取一些帖子並將其存儲到上下文中的類使用GCD異步執行。

如果是這種情況,您如何爲GCD塊創建託管對象上下文? 上下文或託管對象都不是線程安全的,不能在線程之間傳遞。此外,對一個線程上下文所做的更改不會自動傳播到其他線程上的上下文。在iOS5之前,這意味着要監聽NSManagedObjectContextDidSaveNotification並通過使用mergeChangesFromContextDidSaveNotification:方法爲您的NSFetchedResultsController實例進行合併,以查看它。

大圖順便說一下:)

能否請你告訴在點代碼,您:

  1. 創建您的上下文
  2. 在主線程中執行的塊插入 數據
+0

謝謝。我以另一種方式嘗試過,並偶然發現了一個新問題。我編輯了上面的原文。 – Chris

相關問題