[英]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
。
beginWrite
和commitWrite()
更加手動,如果你想要更多的控制,這是很好的。 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() }
}
所以使用這兩者之間沒有區別。 兩者都可供您使用,因此您可以選擇最容易集成到代碼中的一個。 :)
使用beginWrite
和commitWrite
另一種情況是當您不想觸發更改通知時。 為此,您可以將通知令牌傳遞給commitWrite
as commitWrite(withoutNotifying: [token])
。
更多細節在Realm的官方文章 - Interface-Driven Writes中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.