簡體   English   中英

觀察NSManagedObject變量上的didSet

[英]Observe didSet on NSManagedObject variable

我有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://

我在這里找到了答案 ,但不確定如何使用。

這可能是使用自定義訪問器的好地方。

在CoreData中,這可以通過使用基元來實現(每個屬性都有一個基礎基元值 )。 只要確保始終按以下方式在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))
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM