realm.write和realm.beginWrite + realm.commitWrite有什么区别?

loz*_*219 9 realm ios swift

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

1.

try! realm.write {
  ...
}
Run Code Online (Sandbox Code Playgroud)

2.

realm.beginWrite()
...
try! realm.commitWrite()
Run Code Online (Sandbox Code Playgroud)

TiM*_*TiM 7

更新于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)

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