Должен ли я использовать репозиторий для Realm (ios)

Прежде всего, я относительно новичок в ios и не имею никакого опыта использования мобильных dbs.

Хотелось интегрироваться в мое приложение Realm (swift) и задаться вопросом, имеет ли смысл разделять сервисный уровень и репозиторий или просто включать в сервис.

В качестве примера можно привести хороший обзор.

class UserService { var userRepository: UserRepository! func findById(userId: String) -> User? { return userRepository.findById(userId: userId) } } class UserRepository { private let realm = try! Realm() func findById(userId: String) -> User? { return realm.object(ofType: User.self, forPrimaryKey: userId) } } 

Добавление уровня абстракции поверх API баз данных довольно распространено. Многие другие разработчики обернули Realm в своих классах, чтобы скрыть API от их кода бизнес-логики.

Есть несколько соображений, в которых нужно знать:

  1. Вы должны быть осторожны, чтобы не повредить производительность. Некоторые пользователи дошли до того, что копируют данные из объектов Realm в свои собственные объекты. Это нарушает цель механизма «нулевой копии» Realm, поэтому приложение теперь по своей сути выполняет хуже, чем использование Realm изначально.
  2. Это «упреждающая работа». Вы делаете много работы впереди, на всякий случай, если вы можете передумать по очереди. Я преобразовал Core Data в Realm в довольно большое приложение некоторое время назад, и это заняло всего несколько часов. Попытка архитектовать «универсальное» решение для базы данных, которое вы никогда не сможете использовать, используя звуки, которые могут не окупиться.
  3. Вы увеличиваете сложность приложения. Это означает больше возможностей для ошибок, и потребуется более тщательное тестирование, чтобы убедиться, что API и API баз данных синхронизированы.

Пока новая база данных, к которой вы должны перемещаться, состоит также в управлении объектами (например, Core Data), преобразование из одной базы данных в другую обычно не так много. Поэтому я рекомендую избегать ненужной работы до тех пор, пока это станет необходимым.

Отказ от ответственности: я работаю в Realm, но это мое мнение как человека, который отправил личные приложения с использованием Core Data, raw SQLite и Realm в прошлом.

Вы можете использовать расширения, чтобы добавить свои методы выборки. Вы добавляете подклассы Object для каждого объекта в вашей базе данных и затем при необходимости добавляете расширения для каждого из этих методов. Пример:

 import RealmSwift // Dog model class Dog: Object { dynamic var name = "" dynamic var owner: Person? // Properties can be optional } 

Для ваших методов получения:

 extension Dog { class func fetch(with name: String) -> Dog? { return try! Realm().objects(Dog.self).filter("name == %@", name).first } }