在Realm中有两种执行写入事务的方式,它们之间的区别是什么?
1
try! realm.write {
...
}
2
realm.beginWrite()
...
try! realm.commitWrite()
答案 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
。
beginWrite
和commitWrite()
更加手动,如果您想要更多控制权,那就太棒了。 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
是您不想发送更改通知的时间。
为此,您可以将通知令牌传递给commitWrite
,
commitWrite(withoutNotifying: [token])
。
更多细节在Realm的官方文章中 - Interface-Driven Writes