2015-05-13 15 views
20

Mam var zadeklarowana w klasie tak:Korzystanie obserwatorów własności na NSManaged vars

@NSManaged var isFavorite: Bool 

chciałbym zadeklarować obserwatora własności, bardzo podobny do tego poniżej.

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

Jednak Swift mówi mi, że o obserwatorzy mienia na NSMangaged Vars jest niedozwolone. Czy jest jakiś sposób mogę zaimplementować taką funkcję lub coś podobnego do mojej zmiennej isFavorite?

+0

Czy chcesz wysłać powiadomienie lub obsługę obserwatorów z listami wartości kluczowej lub obu? Skąd pochodzi nazwa 'postNotificationWithName()'? –

Odpowiedz

19

Tak - usuń @NSManaged. Nie jest to absolutnie wymagane, ale jeśli go usuniesz, niestety musisz zaimplementować get i set dla tej właściwości. trzeba byłoby dodać coś takiego

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

To trochę irytujące do wdrożenia zarówno z nich, jeśli nie faktycznie ich potrzebują, ale to tak jest do teraz.

Ponieważ będziesz mieć set, możesz nie potrzebować didSet, ale nadal możesz dodać didSet, jeśli chcesz.

+0

Powodem, dla którego zadeklarowałem zmienną jako 'NSManaged' jest to, że wymagam, aby ta zmienna była buforowana lokalnie przy użyciu danych podstawowych (jako część lokalnego magazynu danych Parse). Czy istnieje sposób, aby to rozwiązać? – Satre

+1

Używanie '@ NSManaged' nie jest konieczne w przypadku korzystania z danych podstawowych, jeśli zaimplementowano dodatki podobne do tych w odpowiedzi. Powyższy kod nadal zapisuje dane w magazynie trwałym. –

+0

Xcode daje mi błąd, że moja klasa 'Attendee' nie ma członków o nazwach' setPrimitiveValue' i 'didAccessValueForKey'. – Satre

2

Whoops! Paul Patterson ma rację. To, czego powinieneś użyć, to Key Value Observing - dokładnie to, co według ciebie powinieneś zrobić w linku, który zasugerowałem.

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

Zobacz również Swift Uwagi: https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html (użyj menu 'na tej stronie' w prawym górnym rogu strony na klucz-wartość Obserwując)

Więc coś podobnego

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

w połączeniu z

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

Warto zauważyć, że dokumenty, do których się odwołujesz, wyraźnie ostrzegają, że nie należy zastępować tej metody. –