【问题标题】:Observe didSet on NSManagedObject variable观察 NSManagedObject 变量上的 didSet
【发布时间】:2019-08-28 01:13:43
【问题描述】:

我有 BaseMO 核心数据实体:

extension BaseMO {

    @NSManaged public var id: String
    @NSManaged public var mobileLocalId: String?
    @NSManaged public var pendingToSave: NSNumber?

}

我想要实现的是 @NSManaged 的​​一种 didSet var 功能:

extension BaseMO {

@NSManaged public var id: String {
  didSet {
    if (self.id.contains("<x-coredata://")) {
      fatalError()
    }
  }

@NSManaged public var mobileLocalId: String?
@NSManaged public var pendingToSave: NSNumber?

}

我的每个 NSManagedObjects 对象都是此父 BaseMO 对象的子类。因此,每次我将对象映射(导入)到 credata 时,我都想确保 id 不包含 &lt;x-coredata://

我在这里找到了answer,但不知道如何使用。

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    这可能是使用自定义访问器的好地方。

    在CoreData 中,这可以通过使用原语来完成(每个属性都有一个底层primitive value)。只需确保始终在 getter 和 setter 中实现调用,以保持键值观察正确触发。

    如果记忆正确,CoreData 编程指南曾经对此提供了更多详细信息,但您可以参考 Apple 的文档,了解上面链接的关于原语和正确记账的自定义访问器以获取更多信息。

    使用它,您的代码可以针对您的特定用例进行调整,但最终会看起来像:

    public class BaseMO: NSManagedObject {
    
        @NSManaged fileprivate var primitiveId: String
    
        @objc public var id: String {
            get {
                willAccessValue(forKey: #keyPath(BaseMO.id))
                let value = primitiveId
                didAccessValue(forKey: #keyPath(BaseMO.id))
                return value
            }
            set {
                if (newValue.contains("<x-coredata://")) {
                    fatalError()
                }
                willChangeValue(forKey: #keyPath(BaseMO.id))
                primitiveId = newValue
                didChangeValue(forKey: #keyPath(BaseMO.id))
            }
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2014-10-08
      相关资源
      最近更新 更多