在Realm中有两种执行写入事务的方法,它们之间的区别是什么?
1.
try! realm.write {
...
}
Run Code Online (Sandbox Code Playgroud)
2.
realm.beginWrite()
...
try! realm.commitWrite()
Run Code Online (Sandbox Code Playgroud)
更新于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() }
}
Run Code Online (Sandbox Code Playgroud)
话虽如此,虽然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() }
}
Run Code Online (Sandbox Code Playgroud)
所以使用这两者之间没有区别.两者都可供您使用,因此您可以选择最容易集成到代码中的一个.:)
| 归档时间: |
|
| 查看次数: |
3476 次 |
| 最近记录: |