2015-11-17 3 views
2

Я создал отдельный объект 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!") 
    } 
} 

ответ

2

Существует несколько способов доступа к контексту управляемого объекта. Если вы определили managedObjectContext в AppDelegate вы можете использовать:

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 
    } 
} 

Делая это будет иметь возможность доступа к managedObjectContext на каждом подклассе UIViewController. Тогда вы можете написать:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    self.managedObjectContext.doSomething() 
} 

Заходя managedObjectContext в любой из этих способов вы можете получить managedObjectContext в вашем rootViewController и в любом UIViewController вы создаете.

+0

Спасибо! Я добавил расширение в нижней части WordListsTableViewController, но запрос на выборку в reloadData() все еще дает ошибку «неожиданно найденный nil при распаковке необязательного значения». Должно ли быть что-то в AppDelegate или в ViewWillAppear? – richc

+0

Нет, просто убедитесь, что ваш CoreDataStack инициализирован и этот managedObjectContext инициализирован в вашем расширении. –

+0

Я не вижу, инициализированы ли они. Должен ли я заменить reloadData() внутри viewWIllAppear? – richc

Смежные вопросы