2015-07-23 4 views
56

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

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

  • Насколько мы обеспокоены, если мы будем неоднократно создавать экземпляры Царства? Что такое накладные расходы?
  • Должны ли мы беспокоиться о сохранении экземпляров Realm в ViewControllers или Singletons для повторного использования? Мы пробовали это, но иногда экземпляры получают доступ из разных потоков, поэтому нам приходилось возвращаться к созданию нового экземпляра каждый раз.
  • При доступе к свойствам отношений в экземплярах Realm есть результирующие данные, которые считаются сохраненными в памяти, или каждый раз считывается с диска ? Нужно ли беспокоиться о том, что сохраненные экземпляры 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

ответ

67

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

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

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

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

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

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

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


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

+0

Фантастический! Спасибо за супер быстрый ответ. Мы обязательно поставим больше вопросов, пока они появятся! Вероятно, добавление в автозаполнение, включенное по умолчанию в основном потоке, также должно быть добавлено в документацию. :) – lionpants

+4

Совсем нет! Большое спасибо! Ах, на самом деле я стою исправлено. Я только что вернулся и проверил код, чтобы подтвердить это, и похоже, что autorefresh включен по умолчанию во всех потоках. Я обновил свой ответ, чтобы отразить это. – TiM

+0

Я действительно стесняюсь этой проблемой в отношении исключения памяти, и я не могу обойти ее, и пользователи очень жалуются на производственное приложение. – Eenvincible