首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >realm.write和realm.beginWrite+realm.commitWrite有什么区别?

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

Stack Overflow用户
提问于 2016-11-08 17:55:59
回答 2查看 5.9K关注 0票数 17

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

1.

代码语言:javascript
复制
try! realm.write {
  ...
}

2.

代码语言:javascript
复制
realm.beginWrite()
...
try! realm.commitWrite()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-08 19:22:55

于2017年4月19日更新,以便更简洁,并解释选择一种而不是另一种的优点。

在功能上,两者之间没有区别。realm.write方法是执行写事务的更方便的方法,但是内部仍然简单地使用完全相同的beginWrite/commitWrite事务API:

代码语言:javascript
复制
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

实际上,如果您签出领域Swift的源代码,您将看到realm.write实际上只是beginWrite/commitWrite的包装器。

代码语言:javascript
复制
public func write(_ block: (() throws -> Void)) throws {
    beginWrite()
    do {
        try block()
    } catch let error {
        if isInWriteTransaction { cancelWrite() }
        throw error
    }
    if isInWriteTransaction { try commitWrite() }
}

所以使用这两种方法没有什么区别。这两种方法都是可用的,因此您可以选择最容易集成到代码中的一种。:)

票数 14
EN

Stack Overflow用户

发布于 2017-06-19 08:54:09

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

更多的细节在领域的官方文章- 界面驱动写中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40493495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档