2016-05-20 4 views
2

При синхронизации Я перезаписываю все свои локальные данные с данными сервера. Для этого сначала позвоню realm.delete(realm.objects(MyObj)) для всех моих объектов. Затем я сохраняю объекты ответа с realm.add(obj, update: false). Все в одной транзакции. Полезная нагрузка может занять некоторое время, но она недостаточно велика, чтобы оправдать реализацию разбивки на страницы.Блокировка базы данных Realm?

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

ответ

2

Realm использует алгоритм Multi-Version-Concurrency-Control. Это использует блокировки для обеспечения исключительной записи, в то время как другие потоки могут продолжать читать предыдущие версии данных. У нас есть article on our blog, в котором объясняется, как это работает более подробно.

Помните, что все, что вы пытаетесь решить, является нетривиальным вызовом.

Могут ли они хранить новые элементы, которые были удалены в освобождающейся части транзакции, или это может вызвать ошибку или быть перезаписано во время добавления части?

Пока выполняется фоновая транзакция, другие транзакции записи будут заблокированы. Если вы делаете эти записи из основного потока, вы блокируете основной поток. Если вы делаете их из фоновых потоков, они будут стоять в очереди и выполняться после завершения транзакции синхронизации.

Объекты, которые были удалены в начале, станут недоступными (которые вы можете проверить через invalidated), поскольку транзакции записи всегда работают с последней версией. Если ваши объекты имеют согласованные первичные ключи в ваших операциях синхронизации, вы можете использовать их для повторной выборки и повторить все изменения для свежих экземпляров. Но обратите внимание, что вам нужно сохранить первичные ключи (и все остальные данные объекта) в памяти, прежде чем начинать транзакцию записи, что подразумевает неявное обновление.

+0

Спасибо! если я правильно понял, мне пришлось бы 1. Поместить полный вызов синхронизации (включая удаленный запрос) внутри фоновой транзакции, поэтому возможные операции записи во время синхронизации помещаются в очередь после нее и 2. переписывать все мои записи, чтобы проверить, был ли объект недействителен и извлекает его снова, если да, чтобы они все еще могли нормально выполняться, если синхронизация обновила db между ними? – Ixx

+0

В настоящее время я просто блокирую пользовательский интерфейс (с наложением прогресса) во время синхронизации, чтобы избежать перезаписывания возможных записей за это время. Это, конечно, не очень хороший UX и смотря, как я могу это улучшить. – Ixx

+0

На самом деле, мне не нужна проверка недействительности, так как я не держу ссылки на результаты. Я создаю новое царство для каждого запроса. – Ixx

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