2016-10-15 18 views
0

Пожалуйста, объясните поведение.Синхронизация данных в реальном времени

Если я хочу обновить некоторые данные с помощью Realm я должен сделать что-то вроде этого:

let realm = try! Realm() 
    let theDog = realm.objects(Dog.self).filter("age == 1").first 
    try! realm.write { 
    theDog!.age = 3 
    } 
} 

Но что произойдет, если я просто сделать это: theDog!.age = 3? будут ли данные данных не синхронизированы? Как я могу обновить этот элемент позже?

try! realm.write { 
//what I have to write here? 
    } 

Есть ли способ принудительно синхронизировать каждый элемент? Есть ли недостаток в использовании силовой синхронизации, если он существует?

+0

Определите «силовую синхронизацию», хотя я думаю, что вам повезло, и Realm на самом деле уже делает это для вас автоматически. – EpicPandaForce

+0

Итак, почему в руководстве это обернуто блоком realm.write? – Vyacheslav

+0

Транзакционная модификация. – EpicPandaForce

ответ

1

Пожалуйста, извините мой 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 
} 

Я думаю, что «силовая синхронизация», о которой вы говорите, является основной особенностью Королевства.

+1

Это отличный ответ. Realm соответствует требованиям ACID и использует архитектуру MVCC, что требует поддержки транзакций. Когда вы совершаете транзакцию, это означает, что все копии этого объекта будут обновляться (автоматически на других потоках, если этот поток имеет прикрепленную прокси-панель), включая любую удаленную копию объекта, если вы используете Realm Mobile Platform. –

Смежные вопросы