Область - копия или первичный ключ, чтобы избежать «объект был удален или признан недействительным» - PullRequest
0 голосов
/ 07 сентября 2018

Я использую 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 создает новый объект из его оригинальных переменных и т. Д.

Заранее спасибо!

...