4

我有一个建筑问题。我的应用程序在应用程序窗口中使用 TabBarController。ApplicationDelegate 创建 managedObjectContext,尽管它实际上并不需要它。

TabBarController 中的每个 ViewController 都是 NavigationViewController。每个 NavigationController 的第一个视图控制器是我的自定义视图。所有都是通过 Interface Builder 创建的链接。

现在,我如何以正确的方式传递 managedObjectContext ?实际上,我需要我的视图尽快加载数据,以便当用户选择选项卡或导航到 NavigationControllers 时,数据已经存在。

所以我的问题是:

  1. 如何正确传递上下文?
  2. 我应该什么时候获取我的数据,即使用哪种方法?“viewDidLoad”还是“viewDidAppear”?

感谢所有的想法!

4

4 回答 4

10

您通常应该远离从应用程序委托获取共享对象。它使它的行为太像一个全局变量,并且有一大堆与之相关的问题。而且单例只是花哨的全局变量,所以除非真的有必要,否则应该避免使用它们。

我会managedObjectContext为您的每个视图控制器添加一个属性,并在您创建它们时分配它。这样,您的视图控制器与应用程序委托没有紧密的联系。

至于什么时候取数据,就懒得做。Core Data 真的很快,所以我会等到viewWillAppear:你提取。如果等到viewDidAppear:,则视图已经在屏幕上,并且在数据加载时会有闪烁。但是请注意,viewWillAppear:每次您的视图变得可见时都会调用它(例如,当用户点击导航栏上的后退按钮时,或者模式视图控制器被关闭时),因此您可能想要跟踪您是否已经加载数据并跳过后续调用的加载。

于 2010-11-04T19:59:49.183 回答
2

我遇到了同样的问题,我会分享我的解决方案。

首先,您需要在 nib 文件的选项卡栏中引用导航控制器,确保将其连接起来。

IBOutlet UINavigationController *navigationController;

然后,按照支持文档中的建议获取 Controller 并将 managedObjectContext 发送给它:

SavedTableViewController *saved = (SavedTableViewController *)[navigationController topViewController];
saved.managedObjectContext = self.managedObjectContext;

亚历克斯是对的,“您通常应该远离从应用程序委托获取共享对象。它使它的行为过于像一个全局变量,并且与之相关的问题一团糟。”

于 2011-02-05T16:17:02.670 回答
0

您可以随时从应用程序委托中获取它,如下所示:

myApp *d = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = d.managedObjectContext;

或上述的变体。除此之外,您可以向所有视图控制器添加一个属性并传递它,或者您可以创建一个单例并全局引用它。

于 2010-11-04T19:39:47.767 回答
0

迅速

你不应该分享一个NSManagedObjectContext,但你可以NSPersistentStoreCoordinator分享。

因此,您可以为每个视图创建一个新的托管对象上下文,每个视图共享同一个存储。它是首选方法,并允许并发、多线程访问。在下面的示例中,我假设您的 AppDelegate,*如果使用最新版本的 Xcode 创建并检查了使用核心数据*,则具有名为的属性persistentStoreCoordinator

lazy var managedObjectContext:NSManagedObjectContext? = {
    // This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.

    if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
        let coordinator = appDelegate.persistentStoreCoordinator
        var managedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator
        return managedObjectContext
    }
    }()
于 2015-10-04T06:31:04.453 回答