1

我发现我认为是好的库CoreStore,因为我们看到它们提供了导入和唯一导入,以及在可导入协议后面的映射功能,我们需要在NSManagedObject对象子类中实现这些协议才能设置属性。

我的问题是有文档如何正确映射关系?例如,如果我有一个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]'
4

1 回答 1

1

由于您已经在执行异步块中运行 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)
    }
}
于 2019-04-25T10:25:50.903 回答