gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:43:09 33 4
gpt4 key购买 nike

在Realm中有两种写事务的方式,它们有什么区别?

1.

try! realm.write {
...
}

2.

realm.beginWrite()
...
try! realm.commitWrite()

最佳答案

于 2017 年 4 月 19 日更新,以更加简洁并解释选择其中一个的优势。


在功能上,两者没有区别。 realm.write 方法是执行写入事务的更方便的方法,但是 internally ,它仍然简单地使用完全相同的 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 block 中)。

拥有更多控制权的另一个优势是,您可以实现可能选择完全取消已使用 cancelWrite() 开始的事务的逻辑。

最终,这取决于您希望控制处理特定写入事务的控制级别,以及您希望如何组织代码。根据您计划执行的写入事务的复杂性,您可以轻松地考虑这两者。

realm.write {} 使用闭包,这使得包装事务代码非常优雅且最小,但可能会失去您可能想要的控制量。 beginWrite/commitWrite 为您提供更多控制权,但最终要求您作为用户在处理潜在错误方面做更多工作。


原始答案

两者之间没有任何区别。 realm.write 方法只是一种更方便的执行写入事务的方法,而不是使用 beginWrite/commitWrite

事实上,如果你查看the source code for 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() }
}

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

关于ios - realm.write 和 realm.beginWrite+realm.commitWrite 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40493495/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com