[英]What's the difference between realm.write and realm.beginWrite+realm.commitWrite?
在Realm中有两种执行写入事务的方法,它们之间的区别是什么?
1。
try! realm.write {
...
}
2。
realm.beginWrite()
...
try! realm.commitWrite()
更新于2017年4月19日,更简洁,并解释选择一个优于另一个的优势。
从功能上讲,两者之间没有区别。 方法realm.write
是一种执行写入事务的更方便的方法,但在内部 ,它仍然只是使用完全相同的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
的更方便的方法。
实际上,如果你查看了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() }
}
所以使用这两者之间没有区别。 两者都可供您使用,因此您可以选择最容易集成到代码中的一个。 :)
使用beginWrite
和commitWrite
另一种情况是当您不想触发更改通知时。 为此,您可以将通知令牌传递给commitWrite
as commitWrite(withoutNotifying: [token])
。
更多细节在Realm的官方文章 - Interface-Driven Writes中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.