Я использую Realm в своем проекте iOS Swift в течение 1,5 лет. Это прекрасно работает, это было легко понять и использовать. Однако по мере того, как приложения становятся больше, у меня возникают проблемы с правильным управлением обновлениями данных - один компонент использует некоторые данные, а другой - извлекает их из разных мест и сохраняет одновременно.
Мое решение состояло в том, чтобы сделать какие-то подписки (например, Rx), которые будут уведомлять все компоненты, которые используют эти данные, чтобы обновить их из области. И это работает.
Но, скажем, у меня есть экран A, который использует некоторые данные X. Когда вы нажимаете на элемент списка, он показывает вам детали X. Это очень простой ViewX, в который я просто передаю данные X.
Затем в фоновом режиме что-то происходит, новые данные X были получены с сервера и сохранены в Realm. Однако ViewX не знает об обновлении, поэтому, когда он пытается использовать объект X - «объект был удален или признан недействительным», - и это разумно. Старый объект X был удален, поэтому мы не можем получить к нему доступ.
Есть 3 решения этой ситуации:
1) Добавьте подписку на ViewX (однако IMO это представление слишком «маленькое», чтобы иметь такую вещь - там просто не хватает логики
2) Не передавайте объект X, а просто его ID. Когда ViewX хочет использовать его - он загружает данные из Realm по его идентификатору. Однако не у каждого объекта есть свой уникальный идентификатор.
3) Не передавайте объект X, но это копия.
То, что я считаю лучшим, это вариант 3. Я попробовал его, и он отлично работает. Однако мне было интересно, почему и когда я должен получить доступ к объекту X напрямую и почему и когда использовать его копию. Может быть, я всегда должен использовать копию. Поэтому каждый раз, когда я использую realm.objects(Class)
, я должен делать: let objects = realm.objects(Class).map { (obj) -> Class in obj.copied* }
.
Это будет иметь то преимущество, что использование будет последовательным - всегда передавая копию. Поэтому мне не нужно думать, должен ли я передавать прямой объект, его копию или идентификатор в зависимости от ситуации.
Но, возможно, у этого подхода есть некоторые недостатки. Что ты думаешь?
*copied
создает новый объект из его оригинальных переменных и т. Д.
Заранее спасибо!