Как поделиться ManagedObjectContext при использовании UITabBarController с внутренними UINavigationControllers - PullRequest
4 голосов
/ 04 ноября 2010

У меня архитектурный вопрос.Мое приложение использует TabBarController прямо в окне приложения.ApplicationDelegate создает managedObjectContext, хотя ему это и не нужно.

Каждый ViewController в TabBarController является NavigationViewController.Первый контроллер представления для каждого NavigationController - мои собственные представления.Все это создает ссылку через Интерфейсный Разработчик.

Теперь, как мне правильно передать управляемый объект ObjectObjectContext?На самом деле мне нужны мои представления, чтобы загрузить данные как можно скорее, чтобы, когда пользователь выбирает вкладку или перемещается по NavigationControllers, данные уже были там.

Итак, мои вопросы:

  1. Как правильно передать контекст?
  2. Когда я должен получить свои данные, то есть каким способом?"viewDidLoad" или "viewDidAppear"?

Спасибо за все идеи!

Ответы [ 4 ]

10 голосов
/ 04 ноября 2010

Обычно вам следует избегать получения общих объектов от делегата приложения.Это делает его слишком похожим на глобальную переменную, и с этим связан целый ряд проблем.А синглтоны - это просто причудливые глобальные переменные, поэтому их следует избегать, если в этом нет особой необходимости.

Я бы добавил свойство managedObjectContext для каждого из ваших контроллеров представления и назначил его при создании.Таким образом, ваши контроллеры представлений не имеют тесной связи с делегатом приложения.

Что касается того, когда извлекать данные, вы должны делать это лениво.Базовые данные действительно быстрые, поэтому я бы подождал до viewWillAppear:, чтобы сделать выборку.Если вы подождете до viewDidAppear:, представление уже будет на экране, и при загрузке данных будет мигать.Имейте в виду, однако, что viewWillAppear: вызывается каждый раз, когда ваш вид станет видимым (например, когда пользователь нажимает кнопку «Назад» на навигационной панели, или контроллер модального вида закрывается), так что вы можете отслеживать,Мы уже загрузили данные и пропускаем загрузку при последующих вызовах.

2 голосов
/ 05 февраля 2011

Я столкнулся с той же проблемой, я поделюсь своим решением.

Сначала вам понадобится ссылка на Nav Controller на панели вкладок в nib-файле, убедитесь, что вы подключили его.

IBOutlet UINavigationController *navigationController;

Затем получите контроллер в соответствии с рекомендациями в документации по поддержке и отправьте его управляемогоObjectContext:

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

Алекс прав: «Как правило, вам следует избегать получения общих объектов от делегата приложения. Это делает его слишком похожим на глобальную переменную, и с этим связан целый ряд проблем».

0 голосов
/ 04 октября 2015

Swift

Вы должны не поделиться 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
    }
    }()
0 голосов
/ 04 ноября 2010

Вы можете получить его от представителя приложения в любое время, как это:

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

Или варианты выше.Кроме этого, вы можете добавить свойство ко всем вашим viewcontrollers и передать его, или вы можете создать синглтон и ссылаться на него глобально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...