Безопасно ли помещать Realm.Конфигурация в shouldRestoreApplicationState?

#ios #swift #realm

#iOS #swift #realm

Вопрос:

Я внедряю функции восстановления приложений. Но я обнаружил, что viewDidLoad это вызывается перед didFinishLaunchingWithOptions вызовом. И я должен прочитать некоторые данные из базы данных здесь. Поэтому он всегда выдает исключение try! Realm() . В любом случае, вот как я это делаю сейчас.

     var realmConfigured = false

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        configureRealm()
    }

    func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
        print("restoring")

        configureRealm()
        return true
    }

    func configureRealm(){
        guard !realmConfigured else { return }

        realmConfigured = true

        let config = Realm.Configuration(...)

        Realm.Configuration.defaultConfiguration = config
    }
 

И пока все работает нормально.
Есть ли лучший способ сделать это?

Комментарии:

1. Вопрос немного неясен. Что бы вы хотели, чтобы это было «лучше»? В общем, вы не хотите получать доступ к объектам Realm до того, как Realm была настроена, поэтому отложите создание экземпляров vars до окончания didFinishLaunchingWithOptions . При желании свойства области могут быть определены lazy , чтобы вы могли устанавливать их в любое время, но помните, что не следует обращаться к ним до окончания didFinishLaunchingWithOptions .

2. Главный вопрос: «Безопасно ли помещать Realm. Конфигурация в shouldRestoreApplicationState?» Сейчас я работаю над восстановлением, но мне нужно прочитать данные из базы данных realm viewDidLoad . Процесс восстановления немного отличается от холодного запуска. viewDidLoad вызывается раньше didFinishLaunchingWithOptions . Поэтому, если я попытаюсь прочитать данные здесь, это вызовет исключение. В конце я пытаюсь инициализировать realm в shouldRestoreApplicationState , затем он будет инициализирован до его вызова viewDidLoad . Но я не знаю, безопасно ли это делать.

3. Я думаю, что ваш вопрос приводит к другому вопросу: что вы пытаетесь восстановить? Процесс восстановления состояния приложения предназначен для восстановления иерархий представлений и возврата приложения в исходное состояние — похоже, вы также хотите восстановить пользовательские объекты. Это довольно специфично и изложено в документации Apple, сохраняя пользовательский интерфейс вашего приложения при запуске

4. Этот вопрос даже не коснулся реставрации. У меня есть некоторые настройки настройки, которые инициализируются viewDidLoad . И эти настройки хранятся в базе данных realm. Он отлично работает, когда я отказываюсь от восстановления. Но он начинает выдавать исключения после того, как я соглашаюсь на восстановление. Это все потому viewDidLoad , что вызывается раньше didFinishLaunchingWithOptions в потоке восстановления. Поэтому я добавляю конфигурацию области, к shouldRestoreApplicationState которой вызывается до viewDidLoad того, как все снова будет работать нормально. Я просто не уверен, приведет ли это к другой проблеме в будущем.

5. Вы нашли какое-то решение?