2012-11-21 16 views
16

मैं संपत्ति परिवर्तन की सूचनाएँ प्राप्त करने के रजिस्टर करने के लिए कुंजी मान अवलोकन (KVO), और कैसे के उपयोग के साथ खुश हूँ:,मुख्य मूल्य निरीक्षण - किसी ऑब्जेक्ट के सभी गुणों का निरीक्षण कैसे करें?

[account addObserver:inspector 
      forKeyPath:@"openingBalance" 
      options:NSKeyValueObservingOptionNew 
       context:NULL]; 

लेकिन अगर मैं खाते वस्तु के सभी गुण में परिवर्तन का पालन करना चाहते हैं , इसे कैसे प्राप्त किया जा सकता है? क्या मुझे प्रत्येक संपत्ति के लिए अधिसूचना के लिए पंजीकरण करना है?

उत्तर

17

ऐसा लगता है कि वस्तुओं के सभी गुणों में परिवर्तन के लिए सदस्यता लेने के लिए कोई अंतर्निहित कार्य नहीं है।

आप परवाह नहीं है, तो जिसके बारे में वास्तव में संपत्ति बदल गया है और अपनी कक्षा बदल सकते हैं आप डमी संपत्ति यह (का उपयोग कर + keyPathsForValuesAffectingValueForKey या +keyPathsForValuesAffecting<Key> विधि) अन्य संपत्तियों में परिवर्तन का पालन करने के लिए जोड़ सकते हैं:

// .h. We don't care about the value of this property, it will be used only for KVO forwarding 
@property (nonatomic) int dummy; 

#import <objc/runtime.h> 
//.m 
+ (NSSet*) keyPathsForValuesAffectingDummy{ 

    NSMutableSet *result = [NSMutableSet set]; 

    unsigned int count; 
    objc_property_t *props = class_copyPropertyList([self class], &count); 

    for (int i = 0; i < count; ++i){ 
     const char *propName = property_getName(props[i]); 
     // Make sure "dummy" property does not affect itself 
     if (strcmp(propName, "dummy")) 
      [result addObject:[NSString stringWithUTF8String:propName]]; 
    } 

    free(props); 
    return result; 
} 

अब यदि आप dummy संपत्ति देखते हैं तो आपको प्रत्येक बार किसी ऑब्जेक्ट की गुणों को बदलने के बाद केवीओ अधिसूचना मिल जाएगी।

इसके अलावा आप ऑब्जेक्ट में सभी गुणों की सूची प्राप्त कर सकते हैं जैसे कोड पोस्ट किया गया है और उनमें से प्रत्येक के लिए एक लूप में केवीओ अधिसूचनाओं की सदस्यता लेना है (इसलिए आपको हार्ड कोड संपत्ति मानों की आवश्यकता नहीं है) - इस तरह आप ' अगर आपको इसकी ज़रूरत है तो संपत्ति का नाम बदल जाएगा।

+4

यह अप्रत्यक्ष लगता है, लेकिन मुझे सही दिशा में इंगित किया। class_copyPropertyList() और property_getname() मूल रूप से पूछे जाने वाले सभी संपत्तियों पर अवलोकन जोड़ने के लिए पर्याप्त हैं। –

+0

तो क्या ऊपर दिए गए कोड स्निपेट के लिए कोई अपडेट हैं? – fatuhoku

+0

प्लस, क्या यह NSManagedObjects के लिए काम करता है? – fatuhoku

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