我发现好库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]'
答案 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)
}
}