我有一个NSFetchedResultsController
用于填充UITableView
一些已保存的NSManagedObjects
(每个都有NSMutableAttributedString
属性)。在用户选择单元格后,我检索相应的NSManagedObject
,将其传递给下一个视图控制器,并将NSFetchedResultsController
设置为nil。在下一个视图控制器上,我编辑NSManagedObject
的{{1}}并且不要保存它。这是我的问题,如果我现在回到上一个视图控制器,并从同一个单元重新选择相同的NSMutableAttributedString
,NSManagedObject
仍然具有我之前所做的相同编辑。有谁知道这是为什么以及如何防止它?一些代码片段:
在我的app delegate中:
NSMutableString
具有- (NSString *) saveContext
{
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error;
if (![context save:&error])
{
return [error localizedDescription];
}
else
{
return nil;
}
}
和UITableView
:
fetechedResultsController
答案 0 :(得分:3)
NSFetchedResultsController并没有真正保存任何东西。它是保存(或更改)内容的NSManagedObjectContext。即使您创建了一个新的NSFetchedResultsController,也会继续将它与相同的NSManagedObjectContext重新关联:
...inManagedObjectContext:[self.appDelegate managedObjectContext]]
所以这样想吧:一个托管对象的所有变化......由NSManagedObjectContext管理好。如果使用相同 NSManagedObjectContext创建新的NSFetchedResultsController,则对该托管对象的任何请求都将是相同的(无论是否已保存 - 除非您已杀死该应用程序)。
换句话说,当应用程序仍在运行时,NSManagedObjectContext将在被询问时返回它在内存中的相同托管对象...即使它与新的NSFetchedResultsController相关联。储蓄是一项完全不同的活动。保存对象意味着即使在其环境关闭后它也会存活。但在这种情况下,您不会关闭环境(NSManagedObjectContext)。作为测试,您可以尝试这样做:让第二个VC对托管对象进行更改,但在返回第一个VC之前终止应用程序(不仅仅是暂停)。然后重新启动应用程序,我打赌你不会看到任何改变(因为你没有保存它)。