核心数据/SWIFT:hasChanges不符合预期

ozxc1zmp  于 2022-10-04  发布在  Swift
关注(0)|答案(1)|浏览(129)

此函数的作用与预期不符。我正在尝试将一组字段设置为空。前面的部分获得了正确的字段名,并在其他函数中使用。我有大约十张table,它们都有相同的背景,如果有关系的话。

第一件意想不到的事情是,“是,更改”永远不会运行,因此我假定settings对象与其上下文分离。或者可能CoreData将nil视为触发.hasChanges标志的某种例外?

当它运行时,保存不会抛出任何错误,并且对象会按预期显示,并且显示的值设置为nil。但数据库没有任何变化。

我可以毫无问题地将数据保存到这些字段中,并在数据库中确认;只有在将值设置为nil时才会出现此问题。

static func clearSettings(_ s : Set<PaletteElementType>? = nil) {
    guard var setting = activeSetting() else {return}
    print(setting.id)
    let cats = s ?? PaletteView.compCatButtons
    let tgts = setting.getAssociatedFieldNames(tgts: cats, clearing : true, values: false)
    for (key, val) in tgts {
        var src = Set((val as? Dictionary<FieldNameSuffixes, String>)!.values)
        if key == .catBgndButton {
            src = src.union(["opacity", "opacityStart", "opacityStartDelta","opacityEnd", "opacityEndDelta", "opacityTimer"])
        }
        for s in src {
            print(s)
            setting.setNilValueForKey(s)
            if Blocks.context!.hasChanges {
                print("yes, changes")
            }
            do {
                try Blocks.context!.save()
                print("deleted (setting.value(forKey: s))")
            } catch { print("deadly dogs")}
        }
        print("val is (setting)")
    }
}
yptwkmov

yptwkmov1#

好的,当我这样做的时候,工作:

static func clearSettings(_ s : Set<PaletteElementType>? = nil) {
    guard var setting = activeSetting() else {return}
    print(setting.id)
    let cats = s ?? PaletteView.compCatButtons
    let tgts = setting.getAssociatedFieldNames(tgts: cats, clearing : true, values: false)
    for (key, val) in tgts {
        var src = Set((val as? Dictionary<FieldNameSuffixes, String>)!.values)
        if key == .catBgndButton {
            src = src.union(["opacity", "opacityStart", "opacityStartDelta","opacityEnd", "opacityEndDelta", "opacityTimer"])
        }
        for n in setting.entity.attributesByName.enumerated() {
            if src.contains( n.element.key as String) {
                print("found one")
                setting.setNilValueForKey(n.element.key)
            }
        }
        do {
            try Blocks.context!.save()
        } catch {print("bumpy beasts")}
        print("val is (setting)")
    }
}

很高兴它起作用了,但我真的不明白这里的区别。处理这件事的更好方法是什么?我不是在追求一些超级性能的代码,所以我不介意额外的几次循环……但这是怎么回事呢?

相关问题