Objective-C property-k II. – iOS

A property kezeléssel foglalkozó korábbi cikkben egy igen fontos dologról még nem tettünk említést. Ez egész pontosan a Key-Value Coding és Key-Value Observing.

Ezen módszerek lehetőséget adnak arra, hogy futásidőben összállított kifejezések segítségével specifikáljunk property eléréseket és így olvassunk ki vagy írjunk be értékeket a property-kbe. Mindezek mellett élhetünk a lehetőséggel, hogy felíratkozunk bármely objektumpéldányunk valamely property-jének változásaira, melyről értesítést kapunk.

Key-Value Coding

A módszer alapvetően arról szól, hogy szöveges konstansok illetve szöveges változók segítségével hogy olvashatunk ki egy-egy property értéket, illetve hogyan írhatunk új értéket valamely property-be.

Példaként a következő nagyon egyszerű osztályt használjuk majd:

@interface PropertyHolderClass : NSObject

@property (strong) NSString *Value;

@end

A fenti osztály egy objektumpéldányának property érték kiolvasása és írása a következő formában történhet:

    // a következőkben egy myPropertyTester elnevezésű változó
    // tartalmazza a PropertyHolderClass objektumpéldányt

    // érték kiolvasás
    NSString *value = [myPropertyTester valueForKey:@"Value"];

    // értékadás
    [myPropertyTester setValue:@"5" forKey:@"Value"];

Aki megnézte a setValue szignatúráját, az már tudja, hogy ezt a módszert primitív típusokra nem lehet alkalmazni. A setValue-ban ugyanis (id)-t vár a fordító, így biztosan csak objektum típusokkal foglalkozó property-k esetében lesz használható a módszer.

Key-Value Observing

Ezzel a módszerrel a property érték változásokra íratkozhatunk fel. Ez a következő egyszerű kódsor segítségével történik:

    // a következőkben egy myPropertyTester elnevezésű változó
    // tartalmazza a PropertyHolderClass objektumpéldányt

    [myPropertyTester
        addObserver:self
        forKeyPath:@"Value"
        options:NSKeyValueObservingOptionNew
        context:NULL];

No, a felíratkozással ugyan megvagyunk, de se híre, se hamva annak a selector-nak amit meg kellene hívni ha megváltozott a hivatkozott myPropertyTester Value elnevezésű property-je… :-)

No itt nem is lesz selector, ugyanis az observerként megadott objektumban (a példában ez self, azaz épp ott ahol felíratkozunk) kell implementálni azt a fix metódust, amely meghívódik amint a specifikált property megváltozott. Az implementálni szóhasználat helyett sokkal jobb a felűlírás, mivel ez a metódus az NSObject-ben már létezik.

- (void)observeValueForKeyPath:(NSString *)keyPath
     ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[PropertyHolderClass class]]) {
        // do something ...
    }
}

Természetesen osztályonként egy ilyen metódust implementálhatunk, így ha több property megfigyelésére íratkoztunk fel, akkor a beérkező jelentések feldolgozásában már magunknak kell megállapítani, mely objektum, mely property-je változott, de ehhez valamennyi információt megkapjuk ahogy az a metódus szignatúrájában látható. A példában csak az objektum típusra vizsgáltunk, de bonyolultabb esetben legjobb ha a context felhasználásával azonosítjuk magunkat.

Beejiveim for ipad is currently available from the app store for $6 as a special introductory price
Kategória: Általános | A közvetlen link.