RealmSwift - 交易完成

utk*_*sal 2 realm ios swift

我如何知道特定交易何时完成?

我希望在事务完成后运行特定的代码块.我怎样才能做到这一点?

我在下面的战争中进行写作 -

do {

  try realm.write({
    realm.add(<some object>)
  })
}
catch {}
Run Code Online (Sandbox Code Playgroud)

mar*_*ius 10

事务是同步执行的.因此,您可以在执行事务后立即执行代码.

如果您不提供任何类型的错误处理,我建议如下所示"强制尝试"以在出现错误时中止.如果磁盘空间不足,则事务将无法恢复.在大多数情况下,您可能希望在事务之后的代码中运行,您的数据是持久的,这在发生错误时不适用.此外,如果保持catch路径完全为空,则在开发中看不到任何错误.

try! realm.write {
    realm.add(<some object>)
}
runMoreCode()
Run Code Online (Sandbox Code Playgroud)


Sai*_*ira 7

最好的方法是将方法编写为Realm对象的扩展。

对于斯威夫特 3+

extension Realm {

    /// Performs actions contained within the given block 
    /// inside a write transaction with completion block.
    ///
    /// - parameter block: write transaction block
    /// - parameter completion: completion executed after transaction block
    func write(transaction block: (Void) -> Void, completion: (Void) -> Void) throws {
        try write(block)
        completion()
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2.0

extension Realm {

    /** Performs actions contained within the given block inside a write transaction with
    completion block.

     - parameter block: write transaction block
     - completion: completion executed after transaction block
    */
    func write(@noescape transactionBlock block: Void -> (), completion: Void -> ()) throws {
        do {
            try write(block)
            completion()
        } catch {
            throw error
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以像常规方法一样使用该扩展write(_:)

let realm = try! Realm()
let object = SomeObject()

try! realm.write(
        transactionBlock: {
            realm.add(object)
        },
        completion: {
            print("Write transaction finished")
    })
Run Code Online (Sandbox Code Playgroud)