当我构建更新领域对象的方法时,我总是面临两难境地,如果最好将write
/beginWrite
放在方法中以获得原子性并保持调用方干净,或者最好在调用方中以避免嵌套事务的风险。
出于这个原因,我在想一种无风险嵌套交易的方法,我让这个函数采用了原始write
并对其进行了一点修改:
extension Realm {
func writeNested(_ block: (() throws -> Void)) throws {
let isNested = isInWriteTransaction
if !isNested { beginWrite() }
do {
try block()
} catch let error {
if isInWriteTransaction { cancelWrite() }
throw error
}
if !isNested && isInWriteTransaction { try commitWrite() }
}
}
有什么缺点我没有想到吗?
我不知道
有什么缺点。事实上,我自己也做了同样的事情;我有一个 Realm 助手文件,它有一个 Realm 扩展名,其代码与上面非常相似,但它也有用于类似目的的额外函数:
func addSafe<T : Object>(_ object: T)
func addSafe<T : Object>(_ objects: [T])
func deleteSafe<T : Object>(_ object: T)
func deleteSafe<T : Object>(_ objects: [T])
他们添加/删除对象,也是通过首先检查isInWriteTransaction
属性。我使用它们没有任何问题。
呵。