在领域中有两种执行写事务的方法,它们之间有什么区别?
1.
try! realm.write {
...
}2.
realm.beginWrite()
...
try! realm.commitWrite()发布于 2016-11-08 19:22:55
于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。
实际上,如果您签出领域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() }
}所以使用这两种方法没有什么区别。这两种方法都是可用的,因此您可以选择最容易集成到代码中的一种。:)
发布于 2017-06-19 08:54:09
使用beginWrite & commitWrite的另一种情况是当您不想触发更改通知时。为此,您可以将通知令牌传递给commitWrite as,commitWrite(withoutNotifying: [token])。
更多的细节在领域的官方文章- 界面驱动写中。
https://stackoverflow.com/questions/40493495
复制相似问题