1

需要澄清在SO中有關於NSFetchedResultsController和委託的許多問題/回覆。有時代表會觸發,有時不會。而且由於核心數據非常複雜,因此很難理解正在發生的事情,而無需花費大量時間。另外,文件說有幾個問題,但沒有列出它們。NSFetchedResultsController和NSFetchedResultsControllerDelegate

有幾個已知的問題和行爲iOS上的不同版本變化 與NSFetchedResultsController。

因此,我需要一些關於這樣的類的行爲的說明。特別是,從文檔那裏被寫入以下:

控制器從而有效地三種操作模式,通過它是否具有一個委託和是否高速緩存文件名被設置確定 。

沒有跟蹤:委託設置爲零。控制器只需 即可提供對數據的訪問,就像執行提取時一樣。

僅限內存跟蹤:該委託非零,並且文件高速緩存名稱 設置爲零。控制器監控其結果集中的對象,並更新 更新部分和訂購信息以響應相關的 更改。

完全持久性跟蹤:委託和文件高速緩存名稱是非零無效的 。控制器監視結果集中的對象並更新 部分和響應相關更改的訂購信息。 控制器維護其 計算結果的持久高速緩存。

我正在開發一個相當複雜的應用程序,我利用NSFetchedResultsController從商店檢索數據並將它們顯示在表中。 顯示的管理對象有一個syncStatus布爾變量來驗證它們是否與外部服務同步。 syncStatus變量不顯示在單元格中,顯示不同的信息(例如文本值)。換句話說,syncStatus並不是故障。

在表中,通過NSFetchedResultsController,我顯示了唯一沒有同步的元素(布爾值設置爲NO)。

- (NSFetchedResultsController*)fetchedResultsController 
{ 
    if(_fetchedResultsController) 
     return _fetchedResultsController; 

    NSManagedObjectContext* mainContext = [self managedObjectContext]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"LocalEntity" inManagedObjectContext:mainContext]]; 
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"syncStatus == %@", [NSNumber numberWithBool:NO]]]; 
    [fetchRequest setFetchBatchSize:10]; 

    // sort descriptor here... 

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil]; 
    _fetchedResultsController.delegate = self; 

    return _fetchedResultsController; 
} 

用戶可以選擇他/她想要同步的元素和後臺線程發送所選元素的服務,併爲那些,它也改變了syncStatus變量YES

當操作完成,因爲我設置NSFecthedResultsControllerDelegate,我註冊NSManagedObjectContextDidSaveNotification我也是在主線程通過通知的變化。我能看到該通知包含與正確的變更對象合併),我預計表格會更新(syncStatus設置爲YES的對象將不會顯示)。

說了這個,問題如下。

基於文檔,因爲我用的是內存只跟蹤選項,並缺少的更新是由於isSyncStatus沒有裝上內存,但它仍然是一個錯誤?

你能向正確的方向建議我嗎?

預先感謝您。

P.S.

NSFetchedResultsControllerDelegate方法正確實施。只有在主線程中才能做到這一點。

回答

0

您是否正在執行NSFetchedResultsControllerDelegate方法來刪除單元格?

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 

    [self.tableView beginUpdates];  
} 

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

    UITableView *tableView = self.tableView; 

    switch(type) { 
     case NSFetchedResultsChangeDelete: 

      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];  
      break; 
    }  
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 

    [self.tableView endUpdates];  
} 
+0

是的,當然。我忘了寫在我的問題。謝謝。 –

相關問題