2013-01-16 77 views
5

पुनर्रचना का कहना है की सुविधा देता है कि मेरे पास है:KVO और

@property NSNumber* number; 

और मेरी नियंत्रक को देख रहा है:

- (void)observeValueForKeyPath:(NSString *)keyPath ... 
{ 
    if ([keyPath isEqualToString:@"number"]) ... 
} 

मेरा प्रश्न है - क्या number संपत्ति के नाम पुनर्रचना करने के लिए अपने दृष्टिकोण?

यह स्पष्ट है कि मुझे पर्यवेक्षक कोड में देखी गई कुंजी को अपडेट करने की आवश्यकता है, लेकिन मैं इसे कुछ स्मार्ट/स्वचालित तरीके से कैसे कर सकता हूं, और किसी भी पर्यवेक्षक को मेरी संपत्ति के परिवर्तन को संभालने के लिए देख नहीं सकता?

+0

आप क्या प्रतिक्रिया करना चाहते हैं? मुझे वास्तविक कोड भी नहीं दिखता है जो कुछ करता है। –

+0

क्षमा करें, मैंने अभी अपडेट किया है मेरा मतलब संपत्ति का नामकरण करना और मनाया गया कुंजीपैथ नाम –

उत्तर

3

एक तरीका यह है कि सभी संपत्तियों के लिए स्ट्रिंग स्थिरांक घोषित किया जा रहा है। पर्यवेक्षक जोड़ने और keypath की तुलना करने के लिए इन स्थिरांक का उपयोग करें। जब भी आप संपत्ति का नाम बदलना चाहते हैं तो आपको उन स्ट्रिंग स्थिरांक के मान को बदलना चाहिए।

मुझे नहीं लगता कि पूर्ण परमाणुकरण संभव है।

+0

अपडेट करना हाँ, मैं इसके बारे में सोच रहा था, इसकी अभी भी मांग है;) –

+0

प्रतिबिंब का उपयोग करने का एक और तरीका है।यदि यह तय किया गया है कि वर्ग में आपकी संपत्तियों और उसके आदेश को बदलने वाला नहीं है, तो आप किसी विशेष इंडेक्स की संपत्ति तक पहुंचने जैसे रनटाइम फ़ंक्शंस की सहायता ले सकते हैं। – Apurv

3

ठीक है, मैं खुद को जवाब दूंगा :) मेरा समाधान अपूर्व समाधान और इकाई परीक्षण का मिश्रण है।

संदेश यह है:

MyClass में प्रत्येक मनाया संपत्ति के लिए निर्धारित किए हैं:

static NSString* MyClassPropertyNameNumber = @"number";

में - (void)observeValueForKeyPath:(NSString *)keyPath ... कार्यान्वयन उपयोग केवल परिभाषित NSStrings।

- (void)observeValueForKeyPath:(NSString *)keyPath ... 
{ 
    if ([keyPath isEqualToString:MyClassPropertyNameNumber]) ... 
} 

इकाई परीक्षण जो अगर MyClass वस्तु setNumber: और number चयनकर्ताओं का जवाब की जाँच करेगा लिखें।

- (void)testMyClass 
{ 
    SEL numberGetter = NSSelectorFromString(MyClassPropertyNameNumber); 
    SEL numberSetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:", MyClassPropertyNameNumber]); 

    MyClass* testMyClass = [[MyClass alloc] init]; 
    if (![testMyClass respondsToSelector:numberGetter] || ![testMyClass respondsToSelector:numberSetter]) 
    { 
     STFail(@"%@: %@ property name has changed! Please update your defined property name!", NSStringFromClass([MyClass class]), MyClassPropertyNameNumber); 
    } 
} 

यदि आप संपत्ति का नाम बदल देंगे, और परिभाषित संपत्ति नाम अपडेट नहीं करेंगे तो यह असफल हो जाएगा।

मुझे आशा है कि यह किसी को :) जब दर्ज की

1

प्रत्येक मनाया कुंजी पथ के लिए एक चर को परिभाषित करें, उन्हें संदर्भों के रूप में इस्तेमाल करते हैं और पर्यवेक्षक हैंडलर विधि में लिए उपयोगी होगा:

static void * numberKVO = &numberKVO; 
static void * letterKVO = &letterKVO; 

... 
[self addObserver:self 
     forKeyPath:@"kp.4.number" 
      options:NSKeyValueObservingOptionNew 
      context:numberKVO]; 
[self addObserver:self 
     forKeyPath:@"kp.4.letter" 
      options:NSKeyValueObservingOptionNew 
      context:letterKVO]; 
... 

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if (context == numberKVO) { 
     ... 
    } else if (context == letterKVO) { 
     ... 
    } 
} 

आप संशोधित कर सकते हैं किसी और चीज को बदले बिना गुण और महत्वपूर्ण पथ।

0

Mogenerator कोर डेटा मॉडल कक्षाओं से निपटने के लिए एक शानदार उपकरण है। यह सभी गुणों, रिश्ते, और प्राप्त गुणों के लिए एनएसएसट्रिंग उत्पन्न करता है:

extern const struct ModelClassAttributes 
extern const struct ModelClassRelationships 
extern const struct ModelClassFetchedProperties