如何在写入事务中调用每个struct方法

时间:2018-12-03 08:03:15

标签: swift realm closures

我创建了结构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
    }
}

...

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

1 个答案:

答案 0 :(得分:0)

简短的回答是“否”,没有写事务和没有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

的示例

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

如果您要处理大量对象,则按“操作”对写事务进行分组也不是一个好主意,因为写事务的成本昂贵。您宁愿将这些更改分组到一个交易中,而不要进行很多小交易。