Вложенные транзакции записи в Realm Swift - PullRequest
0 голосов
/ 25 апреля 2019

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

Есть ли минус, о котором я не думал?

1 Ответ

0 голосов
/ 26 апреля 2019

Я не знаю ни о каких минусах. Я сделал то же самое на самом деле; У меня есть вспомогательный файл 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. У меня не было проблем с их использованием.

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...