观察NSManagedObject变量上的didSet

时间:2019-08-27 16:03:11

标签: ios swift core-data

我有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不包含<x-coredata://

我在这里找到了answer,但不确定如何使用它。

1 个答案:

答案 0 :(得分: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))
        }
    }
}