2012-03-14 50 views
6

我正在使用NSFetchedResultsController來填充和管理我的表格數據源。如果我更改某些屬性,是否需要手動保存managedObjectContext for NSFetchedResultsController?

當用戶選擇一個特定行,一個actionsheet彈出,然後讓用戶改變的值該行:

NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:selectedRowIndexPath]; 
[managedObject setValue:status forKey:@"status"]; 

這個作品真的很好,我可以馬上看到tableview中的變化。這意味着NSFetchedResultsController知道某些內容已更改,因此會重新加載該tableviewcell。當我停止並退出我的應用程序(完全)然後重新打開它時,更改不會被保存。

我會認爲NSFetchedResultsConroller負責保存更改。

每次更改後,是否需要使用以下代碼手動保存?

// Save the context. 
NSError *error = nil; 
if (![self.managedObjectContext save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

或者,也許把這個代碼:

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

回答

6

你是正確的。您需要手動將上下文保存到商店。 NSFetchedResultsController從上下文中獲取數據,但不會將數據保存到存儲中。

+0

因此,在'didChangeObject'委託方法內部保存並不是一個壞主意? – Pieter 2012-03-14 12:59:57

+1

如果你這樣做了,你可能會出現循環風險。 NSFetchedResultsController委託方法用於更新視圖,而不是模型。所以無論何時保存到上下文中,視圖都會相應地更新(基本上,這樣您就不必重新加載表視圖)。如果要在委託方法中保存上下文,委託方法將繼續觸發,因爲它會注意到上下文中的更改。 – Gobot 2012-03-14 13:05:14

+0

那麼解決方案是什麼? – fatuhoku 2014-04-04 23:19:05

相關問題