[英]How to pass the ManagedObjectContext to the root view controller in swift
我在 AppDelegate 之外创建了一个单独的 CoreDataStack.swift 对象,以便在使用 CoreData 时遵循此处的大部分建议。 但是如何将 MOC 传递给 AppDelegate 中的 rootViewController? 我是否需要向 AppDelegate 或 ViewController 添加代码? 感谢任何可以在 Swift 中帮助我的人,因为旧的 ObjC 对我不起作用!
我的 CoreDataStack 包括 MOC
lazy var managedObjectContext: NSManagedObjectContext = {
let managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) //
managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator
return managedObjectContext
}()
AppDelegate 有一种方法可以创建一些数据,在 didFinishLaunchingWithOptions 中,我可以打印到控制台以查看其工作情况
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let fetchRequest = NSFetchRequest(entityName: "WordList")
do {
let results = try coreDataStack.managedObjectContext.executeFetchRequest(fetchRequest)
if results.count == 0 {
addTestData()
}
} catch {
fatalError("Error fetching data!")
}
do {
if let results = try coreDataStack.managedObjectContext.executeFetchRequest(fetchRequest) as? [NSManagedObject] { //cast to an array of NSManagedObject
for result in results {
if let listName = result.valueForKey("listName") as? String {
print("Got a '\(listName)'")
}
}
}
} catch {
print("There was a fetch error")
}
// WHAT CODE HERE WILL PASS THE MOC TO THE ROOT VC?
return true
}
我在导航控制器中嵌入了一个简单的 TableViewController
import UIKit
import CoreData
class WordListsTableViewController: UITableViewController {
var coreDataStack: CoreDataStack!
var wordLists = [WordList]()
override func viewDidLoad() {
super.viewDidLoad()
title = "Word Lists"
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "viewWordList")
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
// DO I NEED CODE HERE TO CALL THE MOC?
reloadData()
tableView.reloadData()
}
func reloadData() {
let fetchRequest = NSFetchRequest(entityName: "WordList")
do {
if let results = try coreDataStack.managedObjectContext.executeFetchRequest(fetchRequest) as? [WordList] {
wordLists = results
}
} catch {
fatalError("There was an error fetching wordLists!")
}
}
有几种方法可以访问托管对象上下文。 如果您在 AppDelegate 中定义了managedObjectContext
,则可以使用:
let appDelegate = UIApplicationDelegate.sharedApplication().delegate as! AppDelegate
let managedObjectContext = appDelegate.managedObjectContext
managedObjectContext.doStuff()
通过视图控制器传递managedObjectContext
的第二种方法是创建UIViewController
的扩展。
extension UIViewController {
lazy var managedObjectContext: NSManagedObjectContext {
// Create core data stack or use singleton object
return coreDataStack.managedObjectContext
}
}
通过这样做,将能够访问UIViewController
每个子类上的 managedObjectContext。 然后你可以写:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.managedObjectContext.doSomething()
}
通过以任何这些方式访问 managedObjectContext,您可以在您的rootViewController
和您创建的任何UIViewController
获取managedObjectContext
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.