为Swift 2.0实例化Realm数据库-最佳实践?

12

我想知道在Swift 2中实例化Realm数据库的最佳实践是什么。 Realm针对Swift 1.2和Swift 2之间的一个主要区别是,Realm类增加了对错误处理的支持。 因此,Realm网站上的代码不再起作用:

let realm = Realm()

我能想到几种在Swift 2世界中实例化Realm类的方法:

(1) let 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 的人)关于在 Swift 2 的新错误处理环境中使用 Realm 的最佳实践应该是什么样的。提前致谢。

2个回答

7

除非您实际上要处理接收到的错误,否则我强烈建议使用try!

您的第二个代码片段无法工作,因为如果初始化Realm失败,则该realm变量将永远不会被赋值,这是无效的。您可以通过使realm变量成为Realm?类型来解决这个问题。


1
try! 能解决问题,但我同意 @luckman777 的观点,它感觉不安全,可能会导致应用程序崩溃。如果它确实崩溃了,可能是因为文件丢失或一些迁移错误,可能需要在更全局的范围内处理,比如在 appLaunch 上...另一方面,try? 可以返回可选值并抑制错误处理场景。我自己也不确定哪种方法更好,目前我已将大多数实例更改为 try! ... 希望一切顺利? - Edward Ashak

1

请记住,Realm() 和 write 都可能抛出异常。这意味着除非您使用 try!,否则两者都需要 try-catch。 像这样:

    do {
        let realm = try Realm()

        do {
            try realm.write {
                realm.add(myObject_1)
            }
        } catch let error {
            print(error)
        }

    } catch let error{

        print(error)
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接