Когда я создаю методы, которые обновляют объект области, у меня всегда возникает дилемма, если лучше поместить 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() }
}
}
Есть ли минус, о котором я не думал?