#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. Вы нашли какое-то решение?