gpt4 book ai didi

ios - KVO 不适用于 NSManagedObject 的自定义属性

转载 作者:行者123 更新时间:2023-12-01 16:02:03 24 4
gpt4 key购买 nike

我有一个 NSManagedObject Folder 的子类状态为 Availability

@objc enum Availability: Int16 {
case unknown
case available
case unavailable
}

每当可用性发生变化时,文件夹都必须执行额外的操作(例如删除相关文件)。所以我有
  • internalAvailability保存在核心数据
  • 计算属性 availability使用上述属性

  • `
    extension Folder {
    @NSManaged private var internalAvailability: Availability
    }

    extension Folder {
    private func deleteFiles(...) {
    ...
    }

    @objc dynamic public var availability: Availability {
    get {
    return internalAvailability
    }
    set {
    willChangeValue(forKey: "availability")
    deleteFiles()
    internalAvailability = newValue
    didChangeValue(forKey: "availability")
    }
    }
    }

    使用 Reactive,我想根据可用性更改导航项的标题,但信号永远不会被调用一次!

    ```
    let property = DynamicProperty<NSNumber>(object: folder, keyPath: "availability")
    internalVariable = property // To have a reference of property

    navigationItem.reactive.title <~ property.map { (stateNumber) -> String in
    guard let a = Availability(rawValue: stateNumber.int16Value) else {
    assertionFailure()
    return ""
    }
    let prefix = a == .available ? "" : "(Nope) "
    return "\(prefix)\(folder.name)"
    }

    我已明确将 KVO 合规性添加到该属性中,希望这可以开始工作,但遗憾的是没有结果。

    编辑:如果我创建 DynamicPropertyinternalAvailability而不是 availability , 一切顺利..

    最佳答案

    添加作为答案,因为它成为一个学习练习。希望其他人也能从中受益。

    该应用程序使用多个 managedObjectContext(moc) 架构。 1 个用于进行更改的私有(private) moc 和 1 个使用 mergeChanges 同步自身的主线程 moc .

    在上面的代码中,navigationItem正在使用与 main-moc 一起保存的文件夹实例。 DynamicProperty 正在监听此 main-moc 文件夹实例上的 KVO 更改。我们称之为主文件夹。当我进行更改时,我会修改我们在 private-moc 上的文件夹实例。我们称它为私有(private)文件夹。

    关于修改私有(private)文件夹并调用save在 private-moc 上,名称通知 NSManagedObjectContextDidSave被广播。 main-moc 使用 mergeChanges 进行自身同步。

    mergeChanges 更改主文件夹,但请注意它永远不会调用计算属性 setter availability .直接改internalAvailability .

    因此,我们的计算属性不会发布任何 KVO 通知。

    TL;DR 在 NSManagedObject 子类上执行 KVO 时,使用存储属性而不是计算属性。如果您有一个多 moc(托管对象上下文)方案并使用 mergeChanges要同步,同步时不会调用计算属性的 setter 。

    编辑(解决方案):模式的添加方法keyPathsForValuesAffecting<KeyName> KVO relevant documentation

    @objc class func keyPathsForValuesAffectingAvailability() -> Set<NSObject> {
    return [#keyPath(Folder.internalAvailability) as NSObject]
    }

    关于ios - KVO 不适用于 NSManagedObject 的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52643702/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com