【问题标题】:How to call every struct method inside write transaction如何在写事务中调用每个结构方法
【发布时间】:2019-05-04 12:10:32
【问题描述】:

我创建了 struct Repository 用于操作 Realm 数据库的对象(更改某些属性、添加新对象、删除等)。当我想写入数据库时​​,我必须在 do-try-catch 块中进行,所以我创建了一个完成的方法,每次我需要向数据库写入内容时都会调用它

private func action(_ completion: () -> Void) {
    do {
        try realm.write {
            completion()
        }
    } catch {
        print(error)
    }
}

然后我调用用于操作对象的方法,如下所示:

func createObject(_ object: MyObject) {
    action {
        realm.add(object)
    }
}

func deleteObject(_ object: MyObject) {
    action {
        realm.delete(object)
    }
}

func setTitleForObject(_ object: MyObject, title: String) {
    action {
        object.title = title
    }
}

...

我的问题是,有什么方法可以调用这个Repository 结构中的每个方法,而不是在action 的完成中调用它? (或者是一些更好的方法如何在没有 do-try-catch 块的情况下写入 Realm 数据库?)

【问题讨论】:

    标签: swift realm closures


    【解决方案1】:

    简短的回答是否定的,没有写入事务和try-catch,就无法将数据写入领域。

    realm.write() 是带有beginWrite()commitWrite() 调用的事务构建的便捷包装器。 这两个函数构建了一个事务,commitWrite() 是可抛出的,所以无论如何你都需要换行到try-catch

    https://realm.io/docs/swift/latest#writes

    beginWrite()+commitWrite()https://realm.io/docs/swift/latest#interface-driven-writes使用示例

    在写事务期间可能会发生很多故障。因此,简单地说,不以某种方式处理它是不安全的。

    如果您要处理大量对象,那么按“动作”对写入事务进行分组也不是一个好主意,因为写入事务成本高昂。您宁愿将这些更改分组到单个事务中,而不是进行大量小事务。

    【讨论】:

    • 我没有对写事务进行分组。是单笔交易。我刚刚写了action 方法来节省我很多行代码
    • 单个事务是放入写闭包的事务。在每次action() 调用时,您都会创建一个单独的事务。
    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2017-10-23
    • 2015-12-13
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多