Пожалуйста, извините мой Swift, если я испорчу его, я не слишком хорошо знаком с синтаксисом.
Хотя я знаю, что это пример кода, мне это не очень нравится.
let realm = try! Realm()
let theDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
theDog!.age = 3
}
}
Запрос должен быть внутри блока транзакций, чтобы гарантировать, что вы изменяете последнюю версию объекта.
let realm = try! Realm()
try! realm.write {
let theDog = realm.objects(Dog.self).filter("age == 1").first
theDog!.age = 3
}
}
Теперь, я думаю, что ваш вопрос, почему realm.write {
нужен. Это связано с тем, что вы можете изменять управляемые объекты RealmObject только в транзакции.
Операция необходима для обеспечения того, чтобы экземпляр Realm конкретного потока переключился на «режим записи», и может быть только один экземпляр Realm в «режиме записи» в данный момент времени. В результате этого версия, рассматриваемая данным экземпляром Realm, всегда будет оставаться последовательной и не изменяется - только когда Realm синхронизируется с новой версией.
Так Realm разработан таким образом, что вы можете легко создавать новые версии Realm в фоновом потоке, который затем автоматически синхронизируется с другими экземплярами Realm.
Если транзакция зафиксирована, то при возникновении такого изменения сообщение отправляется в другие потоки (если они могут получать сообщение, в любом случае - требуется цикл событий, например, в потоке пользовательского интерфейса) Экземпляры Realm в этих потоках для обновления самих себя; и вызвать всех слушателей изменений всех результирующих наборов и управляемых объектов RealmObjects, чтобы указать, что они тоже были обновлены (если они изменились с помощью этой транзакции).
Так, чтобы ответить на ваш вопрос, свойства вы изменяющие изменяются во всех RealmObjects, которые принадлежат одному и тому же объекту.
let realm = try! Realm()
let originalDog = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
let theDog = realm.objects(Dog.self).filter("age == 1").first
theDog!.age = 3
}
// assuming there is only 1 dog with age==1,
// originalDog!.age will be 3
}
Я думаю, что «силовая синхронизация», о которой вы говорите, является основной особенностью Королевства.
Определите «силовую синхронизацию», хотя я думаю, что вам повезло, и Realm на самом деле уже делает это для вас автоматически. – EpicPandaForce
Итак, почему в руководстве это обернуто блоком realm.write? – Vyacheslav
Транзакционная модификация. – EpicPandaForce