CoreStore映射关系,同时导入唯一对象

时间:2019-04-25 09:41:52

标签: ios swift core-data swift5 corestore

我发现好库CoreStore是因为我们看到它们提供了可导入协议背后的映射功能,并且我们需要在NSManagedObject对象子类中实现才能设置属性。 / p>

我的问题是是否有文档说明如何正确映射关系?例如,如果我有一个Person,并且有很多地址,我需要使用Person NSManagedObject的同一didInsert函数并执行如下异步事务:

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
        }

看起来对我有用,但是。=抛出:

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

1 个答案:

答案 0 :(得分:1)

由于已经在执行异步块中运行了importUniqueObjects(希望如此),因此您不必担心创建另一个异步事务来导入和添加关系。只需使用参数中包含的事务即可。

与在didInsert中相比,您宁愿在update(来自源:ImportSource,在事务:BaseDataTransaction)中执行此操作,否则一旦更改对象上的某些内容,关系可能会中断。

您甚至不必循环,只要像“地址”是您的关系容器那样使用它就可以:

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)
    }
}