2012-10-01 13 views
10

क्या किसी निगरानी किए गए ऑब्जेक्ट गुणों में संशोधन किए जाने पर अधिसूचित होने के लिए पर्यवेक्षक को जोड़ना संभव है? उदाहरण के लिए:संपूर्ण ऑब्जेक्ट गुणों के लिए केवीओ

[otherObject addObserver:self 
       forKeyPath:@"myObject" 
        options:0 
        context:nil] 

और यदि या तो property1 या property2 संशोधित किया गया है सूचित किया जाए:

@interface OtherObject : NSObject 

@property (nonatomic) MyObject* myObject; 

@end 

और

@interface MyObject : NSObject 

@property (nonatomic) unsigned int property1; 
@property (nonatomic) unsigned int property2; 

@end 

मैं की तरह कुछ करना चाहते हैं। अगर मैं होल्डिंग ऑब्जेक्ट पंजीकृत करता हूं तो यह काम नहीं करता है (किसी भी तरह से समझ में आता है क्योंकि उदाहरण के लिए प्रॉपर्टी 1 को संशोधित करते समय myObject वास्तव में संशोधित नहीं होता है)।

उत्तर

12

मैं दो विकल्पों के बारे में सोच सकता हूं।

  • आप एक अलग "मास्टर" संपत्ति बना सकते हैं और इसे अपने सभी अन्य गुणों पर निर्भर कर सकते हैं।

    @interface MyObject : NSObject 
    @property (nonatomic) id masterProperty; 
    @property (nonatomic) unsigned int property1; 
    @property (nonatomic) unsigned int property2; 
    @end 
    

    + (NSSet *)keyPathsForValuesAffectingMasterProperty { 
        return [NSSet setWithObjects:@"property1", @"property2", nil]; 
    } 
    

    आप masterProperty आपको सूचित किया जाएगा दिखाई देती है तो जब प्रॉपर्टी के किसी भी बदल जाते हैं।

  • आप सभी गुणों की सूची प्राप्त करने के लिए उद्देश्य-सी रनटाइम का उपयोग करते हैं और उन सभी का निरीक्षण करते हैं।

    - (void)addObserverForAllProperties:(NSObject *)observer 
              options:(NSKeyValueObservingOptions)options 
              context:(void *)context { 
        unsigned int count; 
        objc_property_t *properties = class_copyPropertyList([self class], &count); 
        for (size_t i = 0; i < count; ++i) { 
         NSString *key = [NSString stringWithCString:property_getName(properties[i])]; 
         [self addObserver:observer forKeyPath:key 
            options:options context:context]; 
        } 
        free(properties); 
    } 
    
+0

संभवतः, आप कुंजीपैथ्सफॉरवेल्यूफैक्चरिंग मैस्टरप्रोपर्टी में सभी गुणों की एक सूची प्राप्त करने के लिए ऑब्जेक्टिव-सी रनटाइम का उपयोग करके उन दो दृष्टिकोणों को भी जोड़ सकते हैं, फिर उन्हें एनएसएससेट में वापस कर सकते हैं। (एक स्थिर चर का उपयोग करना एक अच्छा विचार हो सकता है ताकि आपको केवल एक बार ऐसा करना पड़े।) – dgatwood

2

क्या तुम कर सकते हो myObject की एक विशेष संपत्ति को संशोधित करने के एक समारोह है ...

-(void)setMyObjectName:(NSString*)name; 

और फिर समारोह में इस कोड है ...

- (void)setMyObjectName:(NSString*)name 
{ 
    [self willChangeValueForKey:@"myObject"]; 

    myObject.name = name; 

    [self didChangeValueForKey:@"myObject"]; 
} 

हो जाएगा ताकि फिर पर्यवेक्षक को सूचित करें जब myObject पर वह संपत्ति बदल दी गई है।

व्हील आपको इस पैटर्न का उपयोग करने की आवश्यकता है और आप myObject पर किसी भी बदलाव के लिए अधिसूचित हो सकते हैं।

:: संपादित :: कहा करने के बाद, आप का उपयोग करने के लिए सक्षम होना चाहिए ...

[otherObject addObserver:self 
       forKeyPath:@"myObject.property1" 
       options:0 
       context:nil]; 

और उस property1 का निरीक्षण करने और एक ही किले अन्य संपत्तियों करेंगे।

लेकिन इसका मतलब यह होगा कि प्रत्येक संपत्ति के लिए व्यक्तिगत रूप से एक पर्यवेक्षक जोड़ना होगा।

+0

शायद willChangeObjectForKey की willChangeValueForKey बजाय? – Andy

+1

@ एंडी बदल गया। आश्चर्यचकित है कि दो साल के लिए देखा नहीं गया था। जबरदस्त हंसी! – Fogmeister

संबंधित मुद्दे