Правильные схемы использования/лучшие практики использования в реальном времени?

В процессе преобразования проекта мы используем Realm. Мы действительно впечатлены пока что с помощью Realm Browser (так удобно!).

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

  • Как мы волновались, если мы будем многократно создавать экземпляры Realm? Что такое накладные расходы?
  • Должны ли мы беспокоиться о сохранении экземпляров Realm в ViewControllers или Singletons для повторного использования? Мы пробовали это, но иногда экземпляры получают доступ из разных потоков, поэтому нам приходилось возвращаться к созданию нового экземпляра каждый раз.
  • При доступе к свойствам отношений в экземплярах Realm, результирующие данные, которые считаются сохраненными в памяти, или считываются из диск каждый раз? Нужно ли нам беспокоиться о сохраненных экземплярах Realm становится слишком большим из-за глубокого доступа к отношениям?
  • Когда требуется обновить экземпляр Realm? Я заметил, что когда Я вношу изменения в браузер Realm, они отражаются в сохраненных Царство без вызова обновления.
    • Похоже, что в каждой области есть свойство Auto-Refresh, которое вызывает это в соответствии с документацией.
  • Доступ к свойству realm при неправильной практике Object? Мы использовали это для записи в Realm, если функция, использующая объект, не создавала объект или Realm (в том же потоке, конечно).

Например...

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

Спасибо заранее. Я с нетерпением жду ваших ответов.: D

+52
источник поделиться
1 ответ

(Отказ от ответственности: я работаю в Realm.:)) Большое спасибо! Приятно слышать, что вы наслаждаетесь королевством!

Несколько экземпляров царства - Вам не нужно об этом беспокоиться! Объект Realm файла создается при создании первого экземпляра в каждом потоке, и тот же объект впоследствии возвращается каждый раз, когда вы пытаетесь выполнить его каждый раз после этого.

Экземпляры хранилища - Следуя с первого момента, нет, вам не нужно беспокоиться о том, чтобы повесить ссылку на Realm внутри других объектов. Поскольку Realm отслеживает свои объекты файла Realm внутри себя и возвращает те же самые, вы не будете наказаны за это. При этом, если постоянная ссылка на объект Realm внутри вашего объекта упрощает вашу сложность кода, не стесняйтесь продолжать использовать его.

Доступ к свойствам свойств Realm - Строго говоря, данные из файлов Realm не копируются с диска (как и обычный ORM); больше он использует сопоставление памяти, чтобы напрямую ссылаться на данные с диска прямо на ваши свойства в памяти. Итак, нет, вам не нужно беспокоиться о том, что файлы Realm становятся слишком большими в памяти.

Автообновление Автообновление включено по умолчанию для объекта Realm file в основном потоке. Он должен быть включен вручную для объектов Realm файла в других потоках, или вы можете вместо этого вручную обновить их с помощью вызова метода refresh.

EDIT: Я стою исправлен! Все объекты Realm файла на нескольких потоках по умолчанию имеют autorefresh. Если autorefresh включен, единственный раз, когда вам нужно позвонить refresh, нужно, чтобы изменения, внесенные в файл Realm, отражались в других ссылках до завершения текущей итерации цикла выполнения.

Ссылка на объект Ссылка на область Абсолютно нет, это неплохая практика вообще! Я на самом деле предпочитаю делать это в своих личных приложениях, которые используют Realm для обеспечения надлежащего контекста, поскольку это всегда проще, и обеспечивает более сильный визуальный контекст между объектом и его родительским файлом Realm в коде. (Ха-ха, если бы здесь была проблема с потоками, вы, вероятно, обнаружили бы ее до достижения точки write).


Я надеюсь, что это помогло! Дайте мне знать, если вам нужно разъяснить что-нибудь здесь!

+61
источник

Посмотрите другие вопросы по меткам или Задайте вопрос