Подтвердить что ты не робот

Создание базы данных 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. Спасибо заранее.

4b9b3361

Ответ 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)
    }