Как стать автором
Обновить

Оффлайн-режим на iOS и особенности его реализации на Realm

Время на прочтение6 мин
Количество просмотров7.3K
Всего голосов 18: ↑17 и ↓1+16
Комментарии2

Комментарии 2

И как этот Realm? Мои впечатления от него ужасные, в итоге заменил на CoreData — с ним проблем меньше. Самая главная проблема с Realm у меня — потоки, решения я так и не нашёл, пришлось "менять коней на переправе". Если обращение к базе данных происходит из разных потоков — именно потоков, а не DispatchQueue — выдаёт ошибку. Решения так и не нашёл, смотрел в исходники, а там всё проверяется в классе на C++. Понятно — это даёт межплатформенность, но работать с ним на Swift становится почти невозможно. Мало того, что единственный вариант — создавать свой STA через класс Thread, ибо DispatchQueue, даже если serial, может обрабатывать в разных потоках, ибо кто нынче так часто работает именно на уровне потоков в эпоху многоядерных процессоров, когда пришлось б оптимизировать под каждый процессор отдельно; так ещё и никаким способом не удаётся вообще не нагружать процессор, т. е. по факту избежать разряда аккумулятора. Я некогда в итоге плюнул на этот Realm и решил использовать CoreData.


Интересно даже, кому и как удалось решить эту проблему с Realm.

Именно из-за проблем с многопоточностью я использовала Realm-объекты только в классах, отвечающих непосредственно за хранение/выдачу информации из базы данных. Дальше они маппились на обычные структуры, которыми я уже спокойно оперировала в остальных частях приложения. Чтобы обновлять свои объекты при изменении Realm-объектов, использовала нотификации, подписывалась на изменения результатов запросов.

Все операции с Realm-объектами происходили в соответствующих методах слоя работы с бд, в каждом методе я создавала instance Realm’а, с которым проводила операции по чтению или записи информации, так что Realm-объекты не передавались между потоками. Перед блоком операции записи проверяла, что мы не в главном потоке.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий