我创建了结构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数据库的更好方法?)
答案 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
在写事务期间可能发生很多故障。因此,简单地说,不以某种方式处理它是不安全的。
如果您要处理大量对象,则按“操作”对写事务进行分组也不是一个好主意,因为写事务的成本昂贵。您宁愿将这些更改分组到一个交易中,而不要进行很多小交易。