Как конвертировать NSManagedObject со связями в класс Swift? - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над приложением для отслеживания личных финансов.До сих пор я использовал классы Swift в качестве уровня абстракции, так как я не знал, что я хочу использовать в качестве постоянного хранилища.У меня есть такие объекты, как Budget, BudgetGroup, BudgetItem, Transaction и Allocation.

BudgetGroup, BudgetItem, Transaction и Allocation уникальны для конкретного экземпляра бюджета.Будет новый Бюджет, и, следовательно, новые BudgetGroups, BudgetItems, Транзакции и Распределения каждый месяц.

Я сейчас пытаюсь реализовать постоянное хранилище, используя Базовые Данные.Мои определенные сущности выглядят так:

Linked Core Data model

Преобразование свойств происходит просто

    func fromManagedObject() -> Transaction {

        let transaction = Transaction(

            identifier: identifier!,
            budget: nil,
            transactionType: TransactionType( rawValue: transactionType ?? "" ) ?? TransactionType.expense,
            date: date!,
            amount: Currency( significand: amount ),
            summary: summary!,
            memo: memo,
            allocations: []

        )

        return transaction

    }

Из-за круговой природы графикапроблема заключается в преобразовании отношений «ко-многим» из управляемого объекта.Использование чего-то простого, например:

let mappedAllocations = (allocations?.allObjects as! [AllocationMO]).map { $0.fromManagedObject( ) }

может закончиться рекурсивным циклом и в конечном итоге привести к сбою.

Не слишком ли сложна моя модель базовых данных?Т.е. он НЕ должен иметь круговые пути?

Я побеждаю лучшие возможности Core Data и тратить ресурсы, конвертируя NSManagedObjects в мой уровень абстракции?

Было бы лучше реализовать набор протоколовкоторым соответствуют Базовые объекты данных, что позволяет избежать необходимости преобразования из одной модели в другую?

1 Ответ

0 голосов
/ 12 апреля 2019

Ваш первый вопрос относительно слишком сложно ... Да, ваша модель данных слишком сложна.Что касается круговых путей , не все круговые пути плохие. Обратные отношения образуют маленькие хорошие круговые дорожки.Но когда Бюджет владеет Транзакциями, а Транзакция владеет Распределениями, но Бюджет также владеет Распределениями напрямую, хотя можно делать такие вещи, и в некоторых случаях это может быть сделано для оптимизации производительности, это сложно, проблематично, и то, что вы бы не сделалихочу заниматься на ранних стадиях проектирования, если вы не действительно умный .Эта рекомендация верна для любого объектно-ориентированного проектирования или проектирования базы данных - с базовыми данными или без них.

Ваш второй вопрос, касающийся уровня абстракции .Если ваш уровень абстракции является интерфейсом внешнего интерфейса (пользовательский интерфейс iOS или macOS), то вы побеждаете одно из преимуществ Core Data, используя уровень абстракции.Для каждого правила есть исключение, но экземпляры NSManagedObject могут и обычно должны подключаться непосредственно к вашему пользовательскому интерфейсу.На заднем плане, конечно, будет слой абстракции JSON или любых других объектов.

Ваш третий вопрос, касающийся протоколов , исчезнет, ​​если вы не используете уровень абстракции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...