簡體   English   中英

realm.write和realm.beginWrite + realm.commitWrite有什么區別?

[英]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

beginWritecommitWrite()更加手動,如果你想要更多的控制,這是很好的。 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() }
}

所以使用這兩者之間沒有區別。 兩者都可供您使用,因此您可以選擇最容易集成到代碼中的一個。 :)

使用beginWritecommitWrite另一種情況是當您不想觸發更改通知時。 為此,您可以將通知令牌傳遞給commitWrite as commitWrite(withoutNotifying: [token])

更多細節在Realm的官方文章 - Interface-Driven Writes中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM