代码之家  ›  专栏  ›  技术社区  ›  Czar

如何与内部UINavigationControllers一起使用UITabBarController时共享ManagedObjectContext

  •  4
  • Czar  · 技术社区  · 16 年前

    TabBarController中的每个ViewController都是一个NavigationViewController。每个导航控制器的第一个视图控制器是我的自定义视图。所有这些都是通过接口生成器创建链接的。

    现在,如何正确地传递managedObjectContext?实际上,我需要我的视图尽快加载数据,这样当用户选择一个选项卡或在导航控制器中导航时,数据就已经存在了。

    所以我的问题是:

    1. 我应该什么时候取数据,即用什么方法?”“viewDidLoad”或“viewDidAppear”?

    谢谢大家的意见!

    4 回复  |  直到 16 年前
        1
  •  10
  •   Alex    16 年前

    通常,您应该避免从应用程序代理获取共享对象。它使得它的行为太像一个全局变量,并且与之相关的问题很多。而单重态只是一个奇特的全局变量,所以除非真的有必要,否则应该避免它们。

    我要加一个 managedObjectContext 属性设置为每个视图控制器,并在创建它们时指定该属性。这样,您的视图控制器与应用程序代理没有紧密的联系。

    至于什么时候取数据,你应该懒洋洋地去做。核心数据非常快,所以我会等到 viewWillAppear: 做你的抓取。如果你等到 viewDidAppear: 将显示视图: 每次您的视图变为可见时(例如,当用户点击导航栏上的“后退”按钮,或取消模式视图控制器时)都会调用,因此您可能希望跟踪是否已加载数据并跳过后续调用的加载。

        2
  •  2
  •   W Dyson    15 年前

    首先,你需要一个nib文件中标签栏中的Nav控制器的引用,确保你连接了它。

    IBOutlet UINavigationController *navigationController;
    

    然后,按照支持文档中的建议获取控制器,并将其发送到managedObjectContext:

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

    亚历克斯是对的,“你通常应该远离从应用程序委托获取共享对象。它使它的行为太像一个全局变量,这会带来一大堆问题。”

        3
  •  0
  •   Ben    16 年前

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

    或以上的变化。 除此之外,还可以向所有viewcontrollers添加一个属性并将其传递出去,或者创建一个singleton并全局引用它。

        4
  •  0
  •   SwiftArchitect    11 年前

    你应该 不 分享 NSManagedObjectContext ,但是你 可以共享 NSPersistentStoreCoordinator .

    使用核心数据 选中*,具有名为 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
        }
        }()