[英]How to observe if a NSManagedObject is removed from managedObjectContext
[英]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.