7

मैं एक दो के साथ NSManagedObject गुण होते हैं।Autoupdating NSManagedObject संपत्ति संशोधन टाइमस्टैम्प

मैं स्पष्ट रूप से -willSave विधि का उपयोग नहीं कर सकता क्योंकि मेरा संदर्भ कभी-कभी सहेजा जाता है, और score_timestamp अद्यतित नहीं होगा। तो मुझे या तो -setScore: ओवरराइड करना चाहिए या अपने प्रबंधित ऑब्जेक्ट को अपने score फ़ील्ड के लिए एक कुंजी-मूल्य पर्यवेक्षक के रूप में सेट करना चाहिए।

-setScore: समाधान आसान लगता है:

- (void) setScore:(NSNumber *)score 
{ 
    [self willChangeValueForKey:@"score"]; 
    [self setPrimitiveScore:score]; 
    [self didChangeValueForKey:@"score"]; 

    self.score_timestamp = [NSDate date]; 
} 

वहाँ चीजें हैं जो रास्ता करने में किसी भी चेतावनियां हैं? या मुझे एक केवीओ समाधान का उपयोग करना चाहिए?

अद्यतन

अब तक मैं दो प्रतिक्रियाओं है कि मेरे कोड setValue: forKey: के माध्यम से काम नहीं करेगा प्राप्त हो गया है और मैं अभी भी उदाहरण के लिए इंतज़ार कर रहा हूँ। बेवकूफ कॉलिंग [(NSManagedObject *)myObject setValue:value forKey:@"score"] मेरे सेटर को वही कहते हैं।

तो अगर मैं केवीओ समाधान पर स्विच करता हूं, तो क्या मुझे सभी awake विधियों में willTurnIntoFault में हटा देना चाहिए? या यह इतना आसान नहीं है?

+0

गंभीरता से, दोनों उत्तरदाताओं ने उस सेट को बताते हुए ... काम नहीं किया गलत है। आप अपने एक्सेसर में ब्रेकपॉइंट डालकर, फिर सेटवैल्यू का उपयोग कर मूल्य बदलकर इसे अपने आप परीक्षण कर सकते हैं। – jrturton

+0

@jrturton मैंने इसे पहले ही परीक्षण किया है, यह निश्चित रूप से बुलाया जाता है। लेकिन मैं यह सुनिश्चित करने के लिए कोर डेटा विशेषज्ञ नहीं हूं कि एक्सेसर के बिना मेरी संपत्ति बदलने का कोई और तरीका है या नहीं। मेरा मतलब है कि कभी-कभी वास्तविक कोड में इस्तेमाल होने का तरीका। – iHunter

+0

नहीं। सभी कोर डेटा कॉल आपके सेटर के माध्यम से जाएंगे (संभवतः पहले सेटव्यू फोरके के माध्यम से)। यह encapsulation सिद्धांत का हिस्सा है। आप इवर के लिए कुछ अजीब सीधी पहुंच प्राप्त कर सकते हैं, लेकिन ऐसा कुछ ऐसा होना होगा जो आपने स्वयं लिखा होगा जो शायद प्रबंधित ऑब्जेक्ट संदर्भ को भी तोड़ देगा। आप अपने आप ऐसा नहीं करेंगे, क्या आप? – jrturton

उत्तर

4

आपके प्रश्न में कार्यान्वयन ठीक है। आपके मूल्य को अपडेट करने के लिए कोई भी केवीसी प्रयास भी सेटटर विधि (setValue: forKey:) के माध्यम से setKey से मेल खाने वाले एक्सेसर विधि की खोज करेगा, विवरण के लिए here देखें)।

+2

मुझे लगता है कि "आपको इस विधि को ओवरराइड नहीं करना चाहिए" 'NSManagedObject -didChangeValue: 'दस्तावेज़ में! – iHunter

+0

यह एक उत्कृष्ट बिंदु है! मैं बेहतर जवाब के बारे में बेहतर सोचूंगा ... – jrturton

+0

मैंने आपका जवाब संपादित कर दिया है क्योंकि खतरनाक होने पर इसे +1 प्राप्त करना शुरू हो गया था। मेरी आभार व्यक्त करने के लिए, मेरी आभार व्यक्त करने के आपके प्रयास के लिए धन्यवाद, मैंने आपके कुछ सवालों के अन्य सवालों के जवाब दिए हैं (वे भी बहुत मददगार हैं :) – iHunter

0

इस विधि में, यदि किसी भी कारण से आप ऑब्जेक्ट को अपने कस्टम सबक्लास के रूप में संशोधित नहीं करते हैं, लेकिन NSManagedObjectsetValue: forKey: का उपयोग करके दिनांक अपडेट नहीं किया जाएगा।

+0

क्या आप एक उदाहरण प्रदान कर सकते हैं? – iHunter

1

आप Key-Value Observing

[objectWithArray addObserver:self 
        forKeyPath:@"score" 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

तो यह निरीक्षण करने के लिए के लिए देख रहे:

-(void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    //Check if [change objectForKey:NSKeyValueChangeNewKey] is equal to "score" 
    //and update the score_timestamp appropriately 
} 

जब आप लाने से जाग आप सूचना के लिए रजिस्टर और अपंजीकृत जब आप गलती चाहिए, मेरा मानना ​​है कि।

+0

हाँ, केवीओ यहां एक अच्छा समाधान है, लेकिन मुझे अपने मौजूदा कोड में कोई समस्या नहीं दिख रही है। मुझे लगता है कि सेटटर में एक और संपत्ति स्थापित करना एक अच्छा विचार नहीं है, लेकिन मैं जानना चाहता हूं क्यों, क्योंकि मुझे लगता है कि यह काम करता है :) – iHunter

+0

यदि आप गारंटी दे सकते हैं कि आपका कोड केवल इस संपत्ति के लिए गतिशील रूप से जेनरेट किए गए गेटर/सेटर का उपयोग करेगा, तो आपका कोड काम करना चाहिए, लेकिन यदि आपने कभी भी सेटव्यू का उपयोग किया है: forKey: टाइमस्टैम्प अपडेट नहीं किया जाएगा। –

+1

@iHunter - बसने में कुछ भी गलत नहीं है एक सेटर में एक और संपत्ति। किसी भी अन्य कोड में इसे स्थापित करने के लिए कोई अलग नहीं है। यदि आप _same_ संपत्ति सेट कर रहे थे, तो आप परेशानी में होंगे, लेकिन यह मामला यहां नहीं है। – jrturton

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