realm.write和realm.beginWrite + realm.commitWrite之间的区别是什么?

时间:2016-11-08 17:55:59

标签: ios swift realm

在Realm中有两种执行写入事务的方式,它们之间的区别是什么?

1

try! realm.write {
  ...
}

2

realm.beginWrite()
...
try! realm.commitWrite()

2 个答案:

答案 0 :(得分:7)

2017年4月19日更新,更加简洁,并解释选择其中之一的优势。

从功能上讲,两者之间没有区别。方法realm.write是执行写入事务的更方便的方法,但是internally,它仍然只是使用完全相同的beginWrite / commitWrite事务API:

public func write(_ block: (() throws -> Void)) throws {
    beginWrite()
    do {
        try block()
    } catch let error {
        if isInWriteTransaction { cancelWrite() }
        throw error
    }
    if isInWriteTransaction { try commitWrite() }
}

话虽如此,虽然realm.write {}编写速度更快,更清晰,但仍有一些情况可能需要依赖beginWrite / commitWrite

beginWritecommitWrite()更加手动,如果您想要更多控制权,那就太棒了。 realm.write {}实现了自己的错误处理例程,但是如果您想执行自己的特定错误处理,则可以使用beginWrite / commitWrite执行此操作(或者,您可以尝试封闭try realm.write {} / do块中的catch

拥有更多控制权的另一个好处是,您可以实施逻辑,可以选择直接取消已使用cancelWrite()启动的交易。

最终,它取决于您控制处理特定写入事务所需的控制级别,以及您希望如何组织代码。根据您计划执行的写入事务的复杂性,您可以轻松地考虑这两种情况。

realm.write {}使用闭包,这使得包装事务代码非常优雅,而且很少,但可能会丢失您可能想要的控制量。 beginWrite / commitWrite为您提供了更多控制权,但最终要求您作为用户在处理潜在错误方面做更多工作。

原始答案

两者之间绝对没有区别。方法realm.write只是执行写入事务的一种更方便的方法,而不是使用beginWrite / commitWrite

事实上,如果您查看the source code for Realm Swift,您会发现realm.write实际上只是beginWrite / commitWrite的包装。

public func write(_ block: (() throws -> Void)) throws {
    beginWrite()
    do {
        try block()
    } catch let error {
        if isInWriteTransaction { cancelWrite() }
        throw error
    }
    if isInWriteTransaction { try commitWrite() }
}

所以使用这两者之间没有区别。两者都可供您使用,因此您可以选择最容易集成到代码中的一个。 :)

答案 1 :(得分:1)

另一种使用beginWrite&的案例commitWrite是您不想发送更改通知的时间。 为此,您可以将通知令牌传递给commitWritecommitWrite(withoutNotifying: [token])

更多细节在Realm的官方文章中 - Interface-Driven Writes