Правильні схеми використання / найкращі практики використання Realm?


76

Зараз ми перетворюємо проект на використання Realm. На даний момент ми дуже вражені, особливо завдяки браузеру Realm (так зручно!).

Як результат, з’явилося декілька запитань, і ми хотіли б отримати деякі конкретні схеми використання, перш ніж йти далі. Наш додаток є багатопотоковим (виклики API, анімація тощо), тому майте це на увазі під час читання питань, оскільки я знаю, що екземпляри Realm не можуть бути доступні в усіх потоках (на даний момент).

  • Наскільки нас турбує неодноразове створення екземплярів Realm? Що таке накладні витрати?
  • Чи варто нам турбуватися про збереження екземплярів Realm у ViewControllers або Singletons для повторного використання? Ми пробували це, але іноді до екземплярів звертаються з різних потоків, тому нам доводилося щоразу повертатися до створення нового екземпляра.
  • Під час доступу до властивостей відносин у екземплярах Realm, чи зберігаються в пам'яті отримані дані, які читаються, або щоразу з диска? Чи потрібно нам турбуватися про те, що збережені екземпляри Realm стануть занадто великими через глибокий доступ до відносин?
  • Коли потрібно оновлення екземпляра Realm? Я помітив, що коли я вношу зміни у браузер Realm, вони відображаються у збереженому Realm без виклику оновлення.
    • Схоже, у кожній області є властивість автоматичного оновлення, яка спричиняє це відповідно до документації.
  • Доступ до realmвласності наObject поганою практикою? Ми використовували це для запису в Realm, якщо функція, що використовує об'єкт, не створила об'єкт або Realm (звичайно, у тому ж потоці).

Наприклад...

func saveStuff(thingToUpdate: Object?) {
   if let thingToUpdate = thingToUpdate, let realm = thingToUpdate.realm {
       realm.write {
           thingToUpdate.name = "lionpants"
       }
   }    
}

Заздалегідь спасибі. Чекаю ваших відповідей. : D

Відповіді:


85

(Застереження: Я працюю в Realm.Зараз я залишив Realm, але все одно радий допомогти!) :) Велике спасибі! Приємно чути, що вам подобається Realm!

Кілька екземплярів Realm - Вам не потрібно турбуватися про це взагалі! Файловий об'єкт Realm створюється під час першого створення кожного екземпляра кожного потоку, і цей самий об'єкт згодом повертається кожного разу, коли ви намагаєтесь інсталювати його кожен раз після цього.

Зберігання екземплярів Realm - Ні, продовжуючи з першого пункту, ні, вам не потрібно турбуватися про те, щоб повісити посилання на Realm всередині інших об’єктів. Оскільки Realm відслідковує свої об’єкти файлу Realm внутрішньо і повертає ті самі, ви за це не будете карати. Сказано, якщо постійне посилання на об’єкт Realm усередині вашого об’єкта спрощує складність коду, не соромтеся продовжувати його використовувати.

Доступ до властивостей Realm Relationship - строго кажучи, дані з файлів Realm не копіюються з диска (як це робить звичайний ORM); Більше того, він використовує відображення пам'яті для безпосереднього посилання на дані з диска безпосередньо у ваші властивості в пам'яті. Отже, ні, вам не потрібно турбуватися про те, що файли Realm стануть занадто великими в пам'яті.

Автоматичне оновлення Автоматичне оновлення ввімкнено лише за замовчуванням для об’єкта файлу Realm у головному потоці. Його потрібно ввімкнути для об’єктів файлів Realm в інших потоках, або ви можете замість цього вибрати вручну оновити їх за допомогою refreshвиклику методу.

EDIT: Я стою виправлений! Усі файлові об'єкти Realm у кількох потоках мають autorefreshувімкнене за замовчуванням. Коли autorefreshувімкнено, єдиний раз, коли вам потрібно зателефонувати, refresh- це якщо вам потрібно, щоб зміни, внесені у файл Realm, були відображені в інших посиланнях до завершення поточної ітерації циклу запуску.

Посилання на посилання на Realm об’єкта Абсолютно ні, це зовсім не погана практика! Я насправді вважаю за краще робити це у власних особистих додатках, які використовують Realm для забезпечення належного контексту, оскільки незмінно це простіше і забезпечує сильніший візуальний контекст між об'єктом та його батьківським файлом Realm у коді. (Ха-ха так, якби тут була проблема з різьбленням, ви, мабуть, виявили б її ще до того, як дійти доwriteсуті).


Сподіваюся, це допомогло! Повідомте мене, якщо вам потрібні роз’яснення щодо чогось тут!


Фантастично! Дякуємо за надзвичайно швидку відповідь. Ми обов’язково розмістимо більше запитань, коли вони з’являться! Можливо, пункт про автоматичне оновлення, який за замовчуванням увімкнено лише в основному потоці, слід також додати до документації. :)
lionpants

4
Зовсім не! Дуже дякую! Ага, насправді я виправлений. Я просто повернувся і перевірив код, щоб підтвердити це, і схоже, що автоматичне оновлення ввімкнено за замовчуванням для всіх потоків зараз. Я оновив свою відповідь, щоб відобразити це.
TiM

Я справді наголошений на цій проблемі щодо винятку пам’яті, і я, здається, не можу її обійти, і користувачі багато скаржаться у виробничій програмі
Eenvincible

Для iOS? Чи можете ви створити про це випуск із додатковою інформацією про репо Realm GitHub? github.com/realm/realm-cocoa
TiM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.