这是苹果官方文档 Core Data Programming Guide 的渣翻译。
Core Data可以和你在Xcode中用来构建UI的StoryBoard特性很好地集成。这个集成可以让你便利地使用依赖注入模式。依赖注入就是一种控制反转。它允许一个框架的调用者能够控制如何传递引用到一个被调用对象中的过程。依赖注入是推荐使用的、用来进行Cocoa开发特别是iOS Cocoa开发的模式之一。
集成Core Data和一个Storyboard Segue
集成Core Data和StoryBoard的一个复杂点就是,如何让table view上需要显示的大量数据和其展示了其中每个数据的细节的子视图控制器数据之间进行转换。如果不使用storyboard,你可以覆写UITableViewDelegate中的tableView:didSelectRowAtIndexPath:方法。然而,有了storyboard,这个方法就不应该使用,而这个转换应该让prepareForSegue:sender:方法来处理。
为了展示如何集成Core Data和一个storyboard segue,可以参考以下例子,这个例子会展示一个包含了employee列表的主视图控制器,这个主视图控制器是一个table view控制器。当这些列表中的employee被点击的时候你想要展示一个包含了这个employee详细信息的视图。可以大体推算出segue中的这个视图控制器有一个属性可以接收被点击选中的NSManagedObject。
OBJECTIVE-C
@interface DetailViewController : UIViewController
@property (weak) AAAEmployeeMO *employee;
@end
SWIFT
class DetailViewController: UIViewController {
weak var employee: AAAEmployeeMO?
}
下一步,在这个segue里,你可以在主控制器中实现prepareForSegue:sender:方法来传递相关的NSManagedObject实例。
OBJECTIVE-C
#define CellDetailIdentifier @"CellDetailIdentifier"
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
id destination = [segue destinationViewController];
if ([[segue identifier] isEqualToString:CellDetailIdentifier]) {
NSIndexPath *indexPath = [[self tableView] indexPathForSelectedRow];
id selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
[destination setEmployee:selectedObject];
return;
}
}
SWIFT
let CellDetailIdentifier = "CellDetailIdentifier"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.identifier! {
case CellDetailIdentifier:
let destination = segue.destinationViewController as! DetailViewController
let indexPath = tableView.indexPathForSelectedRow!
let selectedObject = fetchedResultsController.objectAtIndexPath(indexPath) as! AAAEmployeeMO
destination.employee = selectedObject
default:
print("Unknown segue: \(segue.identifier)")
}
}
当从segue中查询到了segue标识符(必须是storyboard中唯一的),你就可以准确地推断出跳转视图控制器的类型,并传递一个employee实例到跳转视图控制器。这个跳转视图控制器就会拥有此引用,并且在它的生命周期内可以加载相关的数据并显示。这就是依赖注入,主视图控制器控制了如何传递、传递哪一个employee实例到跳转控制器中。