2015-05-13 22 views
20

Ho un var dichiarato in una classe in questo modo:Utilizzando osservatori di proprietà su NSManaged vars

@NSManaged var isFavorite: Bool 

vorrei dichiarare un osservatore di proprietà, molto simile a quello qui sotto.

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

Tuttavia, Swift mi dice che hanno gli osservatori di proprietà su NSMangaged Vars non è permesso. C'è un modo per implementare una funzione o qualcosa di simile per la mia variabile isFavorite?

+0

Vuoi pubblicare una notifica o supportare osservatori di valori-chiave, o entrambi? Da dove viene 'postNotificationWithName()'? –

risposta

19

Sì, eliminare @NSManaged. Non è assolutamente necessario, ma se lo elimini, sfortunatamente devi implementare get e set per la proprietà. Si avrebbe bisogno di aggiungere qualcosa di simile

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 
    } 
} 

È un po 'fastidioso per implementare entrambi questi se non effettivamente bisogno, ma questo è il modo in cui è per ora.

Dato che avrete uno set, potrebbe non essere necessario un didSet, ma è ancora possibile aggiungere uno didSet se ne volete uno.

+0

Il motivo per cui ho dichiarato la variabile come "NSManaged" è che richiedo che la variabile venga memorizzata nella cache localmente utilizzando i dati principali (come parte dell'archivio dati locale di Parse). C'è un modo per risolvere questo? – Satre

+1

L'uso di '@ NSManaged' non è necessario quando si utilizzano i dati principali se si implementano accessor come quelli nella risposta. Il codice sopra salva ancora i dati nell'archivio permanente. –

+0

Xcode mi dà un errore che la mia classe 'Attendee' non ha i membri chiamati' setPrimitiveValue' e 'didAccessValueForKey'. – Satre

2

Whoops! Paul Patterson ha ragione. Quello che dovresti usare è il Key Value Observing - che è esattamente quello che dice che dovresti fare nel link che ho suggerito.

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

vedi note anche veloci: https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html (utilizzare il menu 'In questa pagina' in alto a destra della pagina per valore-chiave Observing)

Quindi qualcosa di simile

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

accoppiato con

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

Vale la pena ricordare che i documenti di riferimento fanno esplicitamente presente che non è necessario sovrascrivere questo metodo. –