【问题标题】:CoreStore map relationships while importing unique objectsCoreStore 映射关系同时导入唯一对象
【发布时间】:2019-09-14 16:58:44
【问题描述】:

我发现我认为是好的库 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 自动执行,或者我走错了路,还有其他一些漂亮的解决方案。

谢谢

正如 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
        }

看起来它对我有用,但是 .= 抛出:

Binary operator '.=' cannot be applied to operands of type 'Set<AddressEntity>' and '[AddressEntity]'

【问题讨论】:

    标签: ios swift core-data swift5 corestore


    【解决方案1】:

    由于您已经在执行异步块中运行了 importUniqueObjects(希望如此),因此您不必担心创建另一个异步事务来导入和添加关系。只需使用参数中的事务即可。

    您宁愿在 update(来自源: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)
        }
    }
    

    【讨论】:

    • .= 是一些二元运算符,或者这只是一个小错误。同样据我了解 transaction.importUniqueObjects 返回数组,我需要将其转换为 set
    • .= 是一个自定义运算符,与 corestore 为 CoreStoreObject 提供的值/关系容器一起使用
    • 你确定)我在演示项目中的文档中没有找到任何关于它的信息作为AssignmentPrecedence中缀运算符,但仍然不知道如何使用,当我尝试做时编译器会抛出错误它在我的 didInsert 函数中。
    • .= 运算符只是 attribute.value = object 的简写,但这仅在您使用值或关系容器时才有效,在您的情况下类似于:letaddresses =Relationship.ToManyOrdered( "addresses", inverse: { $0.person }) - AddressEntity 声明了反向关系。
    • 您显然没有使用 CoreStoreObject 来让 .= 运算符工作。对示例中的不便深表歉意。我看到您已经知道如何从数组中获取 Set。
    猜你喜欢
    • 2011-04-24
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多