Ios 导入唯一对象时存储CoreStore映射关系
我发现,正如我们所看到的,我认为是很好的库,它们在可导入协议后面提供了导入和唯一导入的映射功能,我们需要在Ios 导入唯一对象时存储CoreStore映射关系,ios,swift,core-data,swift5,corestore,Ios,Swift,Core Data,Swift5,Corestore,我发现,正如我们所看到的,我认为是很好的库,它们在可导入协议后面提供了导入和唯一导入的映射功能,我们需要在NSManagedObject对象子类中实现这些功能才能设置属性 我的问题是有文档说明如何正确映射关系?例如,如果我有一个Person和多个地址,我是否需要使用Person NSManagedObject的相同didiinsert func并执行如下异步事务: func didInsert(from source: ImportSource, in transaction: BaseData
NSManagedObject
对象子类中实现这些功能才能设置属性
我的问题是有文档说明如何正确映射关系?例如,如果我有一个Person
和多个地址,我是否需要使用Person NSManagedObject的相同didiinsert func并执行如下异步事务:
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 }
)
}
}
func didiinsert(源代码:ImportSource,事务中:BaseDataTransaction)抛出{
让addresses=source[“addresses”]作为?[[String:Any]]//dict的数组。
地址中的地址{
CoreStore.perform(
异步:{(事务)->中的Void
让json:[String:Any]=/。。。
try!transaction.importUniqueObject(
进入(),
资料来源:地址
)
// ...
},
完成:{uin}
)
}
}
我是否需要异步或同步,以及其他问题,然后如何触发,即使所有关系都已导入或CoreStore自动执行,或者可能我走错了路,还有其他漂亮的解决方案
谢谢
正如Martin所建议的,我添加了类似的内容:
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
}
如果让addressesJsonArray=source[“addresses”]as?[[String:Any]]{
let addresses=try transaction.importUniqueObjects(Into(),sourceArray:AddresssJSONArray)
让convertToSet=Set(addresses.map{$0})
self.phases=convertToSet
}
看起来对我有用,但是
Binary operator '.=' cannot be applied to operands of type 'Set<AddressEntity>' and '[AddressEntity]'
二进制运算符“=”不能应用于“Set”和“[AddressEntity]”类型的操作数
由于您已经在执行异步块中运行了importUniqueObjects(希望如此),因此不必担心创建另一个异步事务来导入和添加关系。只需使用参数中的事务即可
您更希望在更新(源代码:ImportSource,事务代码:BaseDataTransaction)中执行此操作,而不是在diInsert中执行此操作,否则一旦更改对象上的某些内容,您的关系可能会中断
你甚至不必循环,就这样使用它,假设“地址”是你的关系容器:
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)
}
}
func更新(源代码:ImportSource,在事务中:BaseDataTransaction)引发{
如果让addressesJsonArray=source[“addresses”]作为?[[String:Any]]{//dict数组。
addresses.=try transaction.importUniqueObjects(Into(),sourceArray:AddresssJSONArray)
}
}
=是某个二进制运算符,或者这只是一个小错误。另外,据我所知,transaction.importUniqueObjects返回数组,我需要将其转换为setThe.=是corestore为CoreStoreObjects提供的值/关系容器使用的自定义运算符(您确定吗)我在演示项目中的文档中没有找到任何关于它的信息,只是作为AssignmentPreference中缀运算符,但仍然不知道如何使用,当我尝试在didInsert函数中使用时,编译器会抛出错误。=运算符只是attribute.value=object的简写,但只有在使用值或关系容器时才有效,在您的示例中,类似于:let addresses=Relationship.ToManyOrdered(“addresses”,inverse:{$0.person})-已声明反向关系的AddressEntity。显然,您没有使用CoreStoreObject使.=运算符工作。很抱歉给您带来不便。我看到你已经知道如何从数组中获取集合。