繁体   English   中英

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

[英]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

beginWritecommitWrite()更加手动,如果你想要更多的控制,这是很好的。 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() }
}

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

使用beginWritecommitWrite另一种情况是当您不想触发更改通知时。 为此,您可以将通知令牌传递给commitWrite as commitWrite(withoutNotifying: [token])

更多细节在Realm的官方文章 - Interface-Driven Writes中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM