Ios 什么';这是realm.write和realm.beginWrite的区别;realm.commitWrite?
在域中执行写事务有两种方法,它们之间有什么区别 一, 二, 于2017年4月19日更新,更加简洁,并解释了选择其中一个的优势。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
从功能上讲,两者没有区别。方法
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() }
}