Я создал отдельный объект CoreDataStack.swift за пределами AppDelegate, чтобы следовать многим советам здесь при работе с CoreData. Но как передать MOC в rootViewController в AppDelegate? Нужно ли добавлять код в AppDelegate или в ViewController? Спасибо всем, кто может помочь мне здесь, в Swift, поскольку большая часть старого ObjC не работает для меня!Как передать ManagedObjectContext в контроллер корневого представления в swift
мой CoreDataStack включает МОС
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!")
}
}
Спасибо! Я добавил расширение в нижней части WordListsTableViewController, но запрос на выборку в reloadData() все еще дает ошибку «неожиданно найденный nil при распаковке необязательного значения». Должно ли быть что-то в AppDelegate или в ViewWillAppear? – richc
Нет, просто убедитесь, что ваш CoreDataStack инициализирован и этот managedObjectContext инициализирован в вашем расширении. –
Я не вижу, инициализированы ли они. Должен ли я заменить reloadData() внутри viewWIllAppear? – richc