簡體   English   中英

如何快速將 ManagedObjectContext 傳遞給根視圖控制器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM