Создание базы данных Realm для Swift 2.0 - лучшая практика?
Мне интересно, какая наилучшая практика для создания базы данных Realm для Swift 2.
Одним из основных различий между Realm для Swift 1.2 и Swift 2 является то, что класс Realm добавил поддержку обработки ошибок.
Поэтому этот код на веб-сайте Realm больше не работает:
пусть realm = Realm()
Я могу представить пару способов создания класса Realm в мире Swift 2:
(1) пусть realm = try! Realm()
Этот параметр кажется мне немного "небезопасным", поскольку он потенциально может привести к ошибке выполнения, если класс не создает экземпляр.
(2) Поместите всю операцию Realm (включая экземпляр класса) внутри блока Do-Catch
do {
let realm = try Realm()
realm.write{realm.add(myObject)}
}
catch
{
print("Some Realm error")
}
Это определенно работает и определенно безопасно. ОДНАКО, мне не очень нравится создавать
класс Realm каждый раз, когда мне нужно выполнить операцию в базе данных. Если я попытаюсь создать
IVAR 'realm' и разместить его вне блока Do-Catch, переменная выходит за рамки.
Например, следующий код не будет компилироваться...
//IVAR declared outside of Do-Catch...
let realm:Realm
do{
//Get instance of Realm
realm = try Realm()
//This write operation works
realm.write{realm.add(myObject_1)}
}
catch
{
print("Some Realm error")
}
//Create another Dog object
let myObject_2 = SomeObject()
//This next line produces an error: "Variable 'realm' used before being initialized".
//Initialized 'realm' inside Do-Catch is now out of scope.
realm.write({
realm.add(myObject_2)
})
Я был бы признателен за любые отзывы (особенно из Realm) о том, как должна выглядеть лучшая практика для работы с Realms в новой среде обработки ошибок Swift 2. Спасибо заранее.
Ответы
Ответ 1
Если вы не собираетесь обрабатывать полученные вами ошибки, я настоятельно рекомендую использовать try!
.
Второй фрагмент кода не работает, потому что если инициализация Realm не выполняется, переменная realm
никогда не назначается, что является недопустимым. Вероятно, вы можете обойти это, указав переменную realm
типа Realm?
.
Ответ 2
Имейте в виду, что и Realm(), и write могут бросать. Это означает, что им нужно попробовать поймать, если вы не используете try!.
Вот так:
do {
let realm = try Realm()
do {
try realm.write {
realm.add(myObject_1)
}
} catch let error {
print(error)
}
} catch let error{
print(error)
}