Ios NSManagedObject是否自动保存某些属性?
我有一个Ios NSManagedObject是否自动保存某些属性?,ios,core-data,Ios,Core Data,我有一个NSFetchedResultsController,我用它填充UITableView,其中包含一些保存的NSManagedObjects(每个都有一个NSMutableAttributedString属性)。用户选择单元格后,我检索相应的NSManagedObject,将其传递给下一个视图控制器,并将NSFetchedResultsController设置为nil。在下一个视图控制器上,我编辑了NSManagedObject的NSMutableAttributedString,并且不保
NSFetchedResultsController
,我用它填充UITableView
,其中包含一些保存的NSManagedObjects
(每个都有一个NSMutableAttributedString
属性)。用户选择单元格后,我检索相应的NSManagedObject
,将其传递给下一个视图控制器,并将NSFetchedResultsController
设置为nil。在下一个视图控制器上,我编辑了NSManagedObject
的NSMutableAttributedString
,并且不保存它。这是我的问题,如果我现在返回到上一个视图控制器,并从同一单元格中重新选择相同的NSManagedObject
,则NSMutableString
仍具有与我之前所做的相同编辑。有人知道这是为什么吗?我如何预防?一些代码片段:
在我的应用程序代理中:
- (NSString *) saveContext
{
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error;
if (![context save:&error])
{
return [error localizedDescription];
}
else
{
return nil;
}
}
具有UITableView
和fetechedResultsController
的视图控制器:
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSError *error;
if (![[self fetchedResultsController] performFetch:&error])
{
exit(-1);
}
}
- (void)viewDidUnload
{
self.fetchedResultsController = nil;
}
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil)
{
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ComicInfo" inManagedObjectContext:[self.appDelegate managedObjectContext]];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"lastSaved" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:9];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[self.appDelegate managedObjectContext] sectionNameKeyPath:nil
cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
NSFetchedResultsController实际上并没有保存任何内容。NSManagedObjectContext保存(或更改)内容。即使创建了新的NSFetchedResultsController,也会将其与相同的NSManagedObjectContext重新关联:
...inManagedObjectContext:[self.appDelegate managedObjectContext]]
因此,请这样想:托管对象具有其所有更改。。好。。由NSManagedObjectContext管理。如果使用相同的NSManagedObjectContext创建新的NSFetchedResultsController,则对该托管对象的任何请求都将是相同的(无论是否保存,除非您已关闭该应用)
换句话说,当应用程序仍在运行时,NSManagedObjectContext将在被请求时返回内存中的同一托管对象。。。即使它与新的NSFetchedResultsController关联。储蓄是一项完全不同的活动。保存对象意味着即使其环境已关闭,它仍将处于活动状态。但在本例中,您并没有关闭环境(NSManagedObjectContext)。作为测试,您可以尝试这样做:让第二个VC对托管对象进行更改,但在您返回第一个VC之前杀死应用程序(而不仅仅是挂起)。然后重新启动应用程序,我打赌你不会看到所做的任何更改(因为你没有保存它) 如果原始NSManagedObjectContext与零的NSFetchedResultsController重新关联,则将返回托管对象。我猜这就是答案,但在我提交之前想看看一些代码。@JShapiro-我提供了一些代码。即使如此,如果我不保存上下文,它如何仍然保存NSMutableAttributedString?有趣的是,它只选择了那个,而忽略了保存其他东西。谢谢!这是有道理的。因此,我猜解决方案是在我用tableview加载第一个视图控制器时,首先将NSManagedObjectContext设置为nil?如果您不希望第二个VC更改原始托管对象,请制作一个副本:[obj copy]并使用它。