Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 导入唯一对象时存储CoreStore映射关系_Ios_Swift_Core Data_Swift5_Corestore - Fatal编程技术网

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使.=运算符工作。很抱歉给您带来不便。我看到你已经知道如何从数组中获取集合。