我正在对Core Data进行一些测试,假设我有一个带有navigationBar和addButton的mainViewController。 单击addButton将打开detailViewController。当我按下save来插入一个新的Object时,detailVieController将关闭并显示插入了新数据的表。 我可以想到两种不同的方式。
第一种方法 - 传递ManagedObjectContext 在添加按钮的操作中,我创建了一个新的detailViewController的实例,并将managedObjectContext传递给它。因此将是detailViewController的保存按钮,它将负责保存上下文然后弹出控制器。
这是MainViewController中addButton调用的方法
-(void)addNewObject{
DetailViewController *detVC = [DetailViewController alloc]initWhit:self.managedObjectCOntext];
[self.navigationcontroller pushViewController:detVC animated:YES];
}
此方法由IngredientViewController
中的保存按钮调用 -(void)saveObject{
NSError *error;
if (![self.managedObjectContext save:&error]){
NSLog(@"Error");
}
}
第二种方法 - 使用代理人 在addButton的动作中我创建了一个DetailViewController的实例,我将其设置为委托,所以当我按下DetailViewCOntroller中的保存按钮时,将调用将数据传递给主控制器的委托。
这是MainViewController中addButton调用的方法
(void)addNewObject{
DetailViewController *detVC = [DetailViewController alloc]init];
detVC.delegate = self;
[self.navigationcontroller pushViewController:detVC animated:YES];
}
此方法由IngredientViewController
中的保存按钮调用 -(void)saveObject{
[self.delegate detailVCdidSaveObject];
}
这是在mainViewController中实现的委托
detailVCdidSaveObject{
NSError *error;
if (![self.managedObjectContext save:&error]){
NSLog(@"Error");
}
}
------------------------------ 传递对象
最好将原始数据传递给DetailViewController并在那里创建对象,或者最好将对象的实例传递给DetailViewController,它将处理settin的数据?
例如
这样我将mainVC的对象实例链接到一个DetailVC,这样我就可以轻松设置其值
-(void)addObject{
DetailViewController *detailVC =[[DetailViewController alloc]init];
detailVC.delegate = self;
self.object = [NSEntityDescription insertNewObjectForEntityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
detailVC.object = self.object;
[self.navigationController pushViewController:detailVC animated:YES];
}
这样我传递原始数据并让detailVC创建实例
-(void)addObject{
DetailViewController *detailVC =[[DetailViewController alloc]initWithName:@"objname"];
[self.navigationController pushViewController:detailVC animated:YES];
}
这些代码只是用于教育目的的伪代码。各种方式都有效,我只想知道你认为哪种方式最正确,为什么。感谢
答案 0 :(得分:1)
我使用了前两种方法,在我看来它们同样有效(尽管我个人更喜欢委托)。但是,如果您为用户提供取消或返回导航控制器的选项,则第三种方法会导致问题。如果发生这种情况,您将拥有一个您永远不需要创建的对象。
答案 1 :(得分:0)
这听起来像NSFetchedResultsController
的完美用例。 NSFetchedResultsController
是一个对象,可以更轻松地显示UITableView
中核心数据的数据。它甚至会告诉您核心数据中与谓词匹配的对象何时发生更改(插入,删除,更新,移动)。
所以我这样做的方式是MainViewController
会有NSFetchedResultsController
向UITableView
提供数据。当您按下添加按钮时,它将执行您在第一种方法中所拥有的操作。 DetailViewController
将创建新实例,在其上设置值,然后保存managedObjectContext
。
由于MainViewController
包含NSFetchedResultsController
,因此会自动知道已创建新对象,并且可以更新UITableView
以显示该对象。
NSFetchedResutsController
documentation和NSFetchedResutsControllerDelegate
documentation向您展示如何将其与UITableView
一起使用,包括您可以复制到视图控制器中的代码,以完成大部分工作。
答案 2 :(得分:0)
实际答案取决于您的偏好。在我的项目中,我实现了前两种方法。由于凯文提到的相同原因,我的第三种方法肯定是否定的。如果用户取消操作或发生了某些错误,那么您必须注意删除更改(也许在您的didMoveToParentViewController
方法中写下以下代码并取消方法): -
[self.managedObjectContext rollback]
当然假设您没有任何其他进程同时修改该managedObjectContext。
现在,我更喜欢前两种方法,因为: -