RealmSwift - 交易完成

时间:2016-06-25 15:16:42

标签: ios swift realm

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

我希望在交易完成后运行特定的代码块。我怎么能这样做?

我正在以下战争中进行写作 -

Data Source=.\SQLEXPRESS;AttachDbFilename="~/dtbs.mdf";Integrated Security=True;User Instance=True;

2 个答案:

答案 0 :(得分:9)

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

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

try! realm.write {
    realm.add(<some object>)
}
runMoreCode()

答案 1 :(得分:3)

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

适用于Swift 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()
    }
}

Swift 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
        }
    }
}

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

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

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