Ios 什么';这是realm.write和realm.beginWrite的区别;realm.commitWrite?

Ios 什么';这是realm.write和realm.beginWrite的区别;realm.commitWrite?,ios,swift,realm,Ios,Swift,Realm,在域中执行写事务有两种方法,它们之间有什么区别 一, 二, 于2017年4月19日更新,更加简洁,并解释了选择其中一个的优势。 从功能上讲,两者没有区别。方法realm.write是执行写事务的一种更方便的方法,但它仍然简单地使用完全相同的beginWrite/commitWrite事务API: public func write(_ block: (() throws -> Void)) throws { beginWrite() do { try bl

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

一,

二,

于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
//code>catch块中)

拥有更多控制权的另一个好处是,您可以实现逻辑,选择直接取消已使用
cancelWrite()
启动的事务

最终,它取决于您希望控制处理特定写事务的控制级别,以及您希望如何组织代码。根据您计划执行的写入事务的复杂性,可以很容易地同时考虑这两种情况。
realm.write{}
使用闭包,这使得事务代码的包装非常优雅、简单,但可能会失去您想要的控制量
beginWrite
/
commitWrite
为您提供了更多的控制,但最终要求您作为用户在处理潜在错误方面做更多的工作


原始答案

两者之间绝对没有区别。方法
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() }
}
事实上,如果您签出,您将看到
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() }
}

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

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

更多细节见王国官方文章-

我必须是半盲的,但在
try的情况下,如果出现错误,我也会看到自动取消交易!realm.write{
。希望不是!:)是的,
realm.write
有一些额外的细节。使用
realm.beginWrite
/
realm.commitWrite
可以提供最终的手动控制,但这意味着您也要对自己的错误处理负责。(尽管如此,如果您使用
try!
关键字忽略错误处理,这一切都是毫无意义的)。我以前遇到过一些奇怪的情况,因为写入事务没有在出错时取消,所以我认为
realm.write
在这方面更安全,就像
realm.executeTransaction()
在Java领域。@TiM也许你应该在答案正文中添加关于细节的注释,这正是我的问题所在。:)谢谢!@VictorLaerte好主意!我将用我们在这里讨论的内容改进我的答案。:)
public func write(_ block: (() throws -> Void)) throws {
    beginWrite()
    do {
        try block()
    } catch let error {
        if isInWriteTransaction { cancelWrite() }
        throw error
    }
    if isInWriteTransaction { try commitWrite() }
}