Ради вопроса, вот простой пример (с несколькими ярлыками):Realm Swift: Обновление объекта внутри закрытия
class Foo: Object {
dynamic var id: Int = 0
[...]
}
class Bar: Object {
dynamic var id: Int = 0
dynamic var foo: Foo?
convenience required init(data: AnyObject) {
self.init()
self.id = data.id as! Int
if let foo_id = data.foo_id as? Int {
// Function querying the remote database and returning an object
Foo.get(foo_id) { (foo) -> Void in
self.foo = foo // Foo object assigned, as expected
}
}
}
}
Если я делаю self.foo = foo
в закрытии get()
функция, я получил исключение:
исключение «RLMException», причина: "Попытка изменить объект за пределами транзакции записи - вызов beginWriteTransaction на RLMRealm экземпляр первого.
Так что, если я хочу добавить realm.write вокруг него, как на вопрос предыдущего исключения:
...
Foo.get(foo_id) { (foo) -> Void in
let realm = Realm(path: Realm.defaultPath)
realm.write {
self.foo = foo
}
}
...
На этот раз я получить новый один:
исключение «RLMException ', причина: «Невозможно добавить объекты из другого королевства»
Я застрял, и я не могу понять, что такое Realm is wantin g от меня здесь, док не помогает.
Я не привык к царству, поэтому я полагаю, что у меня что-то не так, как это работает, но я не знаю, что.
Спасибо за вашу помощь
Выполняете ли вы это на объекте, который уже был сохранен в * ЛЮБОМ * другом Царстве? Что-то еще, чем 'Realm.defaultPath'?Первое исключение очевидно - либо 'beginWriteTransaction()' -> write -> 'commitWriteTransaction()', либо блок, который вы упомянули. Другое исключение возникает, когда вы пытаетесь обновить объект в ** неправильном ** царстве, чем тот, который вы уже сохранили. – Michal
У меня только одно царство, я использую по умолчанию. Я думал, что это может быть связано с использованием 'self' в закрытии после того, как объект был инициализирован? – Sylver
Я также попробовал 'self.realm.write() {...}', но 'self.realm' является необязательным и равен нулю при попытке написать мой объект, поэтому я не вижу смысла использовать этот код – Sylver