导入唯一对象时 CoreStore 映射关系
CoreStore map relationships while importing unique objects
我发现我认为很好的库 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 { [=11=] })
self.phases = convertToSet
}
看起来对我有用,但是 .= 抛出:
Binary operator '.=' cannot be applied to operands of type 'Set<AddressEntity>' and '[AddressEntity]'
因为您已经 运行 importUniqueObjects 在执行异步块中(希望如此),您不必担心创建另一个异步事务来导入和添加关系。只需使用参数中的交易即可。
您宁愿在更新(来自源:ImportSource,在事务:BaseDataTransaction)中执行此操作,也不愿在 didInsert 中执行此操作,否则一旦您更改对象上的某些内容,您的关系可能会中断。
你甚至不必循环,就这样使用它,假设"addresses"是你的关系容器:
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)
}
}
我发现我认为很好的库 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 { [=11=] })
self.phases = convertToSet
}
看起来对我有用,但是 .= 抛出:
Binary operator '.=' cannot be applied to operands of type 'Set<AddressEntity>' and '[AddressEntity]'
因为您已经 运行 importUniqueObjects 在执行异步块中(希望如此),您不必担心创建另一个异步事务来导入和添加关系。只需使用参数中的交易即可。
您宁愿在更新(来自源:ImportSource,在事务:BaseDataTransaction)中执行此操作,也不愿在 didInsert 中执行此操作,否则一旦您更改对象上的某些内容,您的关系可能会中断。
你甚至不必循环,就这样使用它,假设"addresses"是你的关系容器:
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)
}
}