Связи карт CoreStore при импорте уникальных объектов - PullRequest
0 голосов
/ 25 апреля 2019

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

У меня вопрос, есть ли документация, как правильно отобразить отношения?Например, если у меня есть один Person и много адресов, нужно ли мне использовать одну и ту же функцию didInsert Person NSManagedObject и выполнять асинхронную транзакцию следующим образом:

func didInsert(from source: ImportSource, in transaction: BaseDataTransaction) throws {

let addresses = source["addresses"] as? [[String: Any]] // array of dict.

for address in addresses {
CoreStore.perform(
    asynchronous: { (transaction) -> Void in
        let json: [String: Any] = // ...
        try! transaction.importUniqueObject(
            Into<AddressEntity>(),
            source: address
        )
        // ...
    },
    completion: { _ in }
)
}

}

Нужно ли делать это асинхронно или синхронизировать иДругой вопрос, как тогда вызвать даже то, что все отношения импортированы, или CoreStore делает это автоматически, или, может быть, я нахожусь на неправильном пути, и есть какое-то другое красивое решение.

Спасибо

Как предложил Мартин, у меня естьдобавил что-то похожее:

if let addressesJsonArray = source["addresses"] as? [[String: Any]] {
            let addresses = try transaction.importUniqueObjects(Into<Address>(), sourceArray: addressesJsonArray)

            let convertToSet = Set(addresses.map { $0 })

            self.phases = convertToSet
        }

Похоже, у меня это работает, но. = throws:

Binary operator '.=' cannot be applied to operands of type 'Set<AddressEntity>' and '[AddressEntity]'

1 Ответ

1 голос
/ 25 апреля 2019

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

Вы бы предпочли сделать это в обновлении (из источника: ImportSource, в транзакции: BaseDataTransaction), чем в didInsert, иначе ваши отношения могут разорваться, если вы что-то изменитена объекте.

Вам даже не нужно зацикливаться, просто используйте его таким образом, предполагая, что "адреса" - это ваш контейнер отношений:

func update(from source: ImportSource, in transaction: BaseDataTransaction) throws {
    if let addressesJsonArray = source["addresses"] as? [[String: Any]] { // array of dict.
        addresses .= try transaction.importUniqueObjects(Into<AddressEntity>(), sourceArray: addressesJsonArray)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...