2015-05-13 6 views
20

ich eine var in einer Klasse deklariert haben wie so:Mit Eigenschaft Beobachter auf NSManaged Vars

@NSManaged var isFavorite: Bool 

Ich mag würde eine Eigenschaft Beobachter, sehr ähnlich dem unten erklären.

var organization: String { 
     didSet { postNotificationWithName("newData") } 
    } 

jedoch Swift sagt mir, dass mit Eigentum Beobachter auf NSMangaged Vars ist nicht erlaubt. Gibt es eine Möglichkeit, ein solches Feature oder etwas ähnliches für meine isFavorite Variable zu implementieren?

+0

Möchten Sie eine Benachrichtigung senden oder Schlüsselwertbeobachter unterstützen, oder beides? Woher kommt 'postNotificationWithName()'? –

Antwort

19

Ja - löschen Sie die @NSManaged. Es ist nicht unbedingt erforderlich, aber wenn Sie es löschen, müssen Sie leider get und set für die Eigenschaft implementieren. Sie wäre so etwas wie

public var newData: String? 
    { 
    set { 
     self.willChangeValueForKey("newData") 
     self.setPrimitiveValue(newValue, forKey: "newData") 
     self.didChangeValueForKey("newData") 
    } 
    get { 
     self.willAccessValueForKey("newData") 
     let text = self.primitiveValueForKey("newData") as? String 
     self.didAccessValueForKey("newData") 
     return text 
    } 
} 

Es ist eine Art ärgerlich diese beiden zu implementieren, wenn Sie nicht wirklich benötigen hinzufügen müssen, aber das ist so, wie es jetzt ist.

Da Sie eine set haben, benötigen Sie möglicherweise keine didSet, aber Sie können immer noch eine didSet hinzufügen, wenn Sie eine möchten.

+0

Der Grund, warum ich die Variable als 'NSManaged' deklariert habe, besteht darin, dass ich diese Variable lokal unter Verwendung der Core Data (als Teil des lokalen Datenspeichers von Parse) zwischenspeichern muss. Gibt es eine Möglichkeit, das zu lösen? – Satre

+1

Die Verwendung von '@ NSManaged' ist bei der Verwendung von Core Data nicht notwendig, wenn Sie Accessoren wie die in der Antwort implementieren. Der obige Code speichert weiterhin Daten im persistenten Speicher. –

+0

Xcode gibt mir einen Fehler, dass meine'Attendee' Klasse nicht die Mitglieder 'setPrimitiveValue' und' didAccessValueForKey' hat. – Satre

2

Whoops! Paul Patterson hat Recht. Was Sie verwenden sollten, ist Key Value Observing - was genau das ist, was Sie in dem von mir vorgeschlagenen Link tun sollten.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

Siehe auch rasche Hinweise: https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html (verwenden Sie das 'Auf dieser Seite' Menü oben rechts auf der Seite für Key-Wert Observing)

So etwas wie

objectToObserve.addObserver(self, forKeyPath: "organization", options: .New, context: &myContext) 

gepaart mit

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
+1

Es lohnt sich, darauf hinzuweisen, dass die von Ihnen referenzierten Dokumente Sie explizit warnen, dass Sie diese Methode nicht überschreiben sollten. –