2011-10-11 25 views
8

में बदलती है क्या माता-पिता इकाई में कॉलबैक या अधिसूचना प्राप्त करना संभव है जब किसी के रिश्ते की वस्तुएं बदलती हैं? यह बहुत अच्छा काम करता है जब इकाई की विशेषता बदल जाती है। निम्न विधि ...मूल डेटा को सूचित करें जब बच्चे डेटा रिलेशनशिप एंटिटी कोर डेटा

- (void)didChangeValueForKey:(NSString *)key

मेरी इकाई उपवर्ग पर शुरू हो जाती है। हालांकि इस विधि को लागू नहीं किया जाता है जब किसी एक रिश्ते में एक विशेषता बदल जाती है।

जो मैं करने की कोशिश कर रहा हूं वह समय है जब मैं अपने माता-पिता इकाई पर किसी भी विशेषता या रिलेशनशिप ऑब्जेक्ट्स बदलता हूं।

उत्तर

5

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

एक विशिष्ट बाल इकाई को देखने के लिए कहीं अधिक मुश्किल है। इसके बारे में जाने के कुछ तरीके हैं:

  1. क्या बच्चे गुणों को बदलते समय माता-पिता को पिंग करते हैं।
  2. माता-पिता को NSManagedObjectContextDidSaveNotification के लिए सुनें और देखें कि उसके किसी भी बच्चे
  3. से बचें, क्या माता-पिता बच्चों पर मूल्यों का पालन करते हैं।

अन्य समाधान हो सकते हैं लेकिन तीनों में से मैं # 2 की सिफारिश करता हूं। इसे स्थापित करना बहुत आसान है और प्रदर्शन प्रभाव बहुत कम है।

+0

मुझे प्यार है कि मैं शून्य में एक प्रश्न भेज सकता हूं और प्रतिक्रिया प्राप्त कर सकता हूं! मैंने समाधान # 2 पर फैसला किया। मैं माता-पिता के रिश्तों के माध्यम से लूपिंग कर रहा हूं और जांच कर रहा हूं कि कोई रिश्ते प्रबंधित है ऑब्जेक्ट्स अधिसूचना प्रबंधित ऑब्जेक्ट के समान हैं। –

+0

याद रखें कि आप उन 'NSSet' उदाहरणों के विरुद्ध एक अनुमान लगा सकते हैं जो वापस आते हैं। लूप की कोई ज़रूरत नहीं है :) भविष्यवाणी '@" इकाई जैसी कुछ हो सकती है। नाम ==% @ और& parent ==% @ "' जो आपको उस मौजूदा इकाई के किसी भी बच्चे को वापस देगी जो आपके संबंध में है। –

+0

बहुत बढ़िया, धन्यवाद! एक जादू की तरह काम करता है। मुझे उम्मीद है कि अगर आप इस विषय पर अपने ब्लॉग पोस्ट का लिंक शामिल करते हैं तो आपको कोई फर्क नहीं पड़ता ["पेरेंट वॉचिंग इट्स चाइल्ड"] (http: //www.cimgf।कॉम/2011/10/14/अभिभावक-देख-उसका-बच्चा /) और आपकी पुस्तक ["कोर डेटा"] के लिए एक प्लग भी है (http://www.amazon.com/Core-Data-Apples-API-Persisting/डीपी/1 9 34356328/रेफरी = sr_1_3? यानी = यूटीएफ 8 और क्यूआईडी = 1319500666 और एसआर = 8-3) मैंने इसे अक्सर संदर्भित किया है। इसके अलावा, मेरे मामले में मुझे अन्य चीजों को करने की आवश्यकता थी, जो एनएसएमएनेज्ड ऑब्जेक्ट सबक्लास में टाइमस्टैम्प के लिए आदिम एक्सेसर्स बनाते थे, ताकि इसे अनंत अधिसूचना लूप में जाने से रोका जा सके। –

1

दूसरे उत्तर में मुझे 1,2 और 3 बहुत अक्षम पाए गए। विशेष रूप से 2 और "पेरेंट वॉचिंग इट्स चाइल्ड" ब्लॉग पोस्ट में उदाहरण। इसके साथ मेरा मुद्दा है कि प्रत्येक एकल माता-पिता को संदर्भ अधिसूचना का जवाब देना पड़ता था और अनिवार्य रूप से हर वस्तु को बचाया जाता है यदि वह बच्चा है (इस तथ्य में कभी भी इस तथ्य को ध्यान में रखें कि ContextDidSave अधिक उपयुक्त है!)। इसके बजाय, मैं एक विकल्प 4:

  1. बच्चे को ओवरराइड किया गया है और माता-पिता युक्त एक NSManagedObjectContextDidSaveNotification प्रसारित करें।

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

-(void)didSave{ 
    [super didSave]; 
    // notify that the parent has changed. 
    [[NSNotificationCenter defaultCenter] postNotificationName:NSManagedObjectContextObjectsDidChangeNotification 
                 object:self.managedObjectContext 
                 userInfo:@{NSUpdatedObjectsKey : [NSSet setWithObject:self.parent]}];; 
} 

माता पिता टाइमस्टैम्प, स्वच्छ समाधान निम्नलिखित (second last post) मैं मदद कर सकता है का उपयोग कर रहे हैं, उदाहरण के अद्यतन करने के लिए अभिभावक उपयोग में:

- (void) awakeFromInsert 
{ 
    [super awakeFromInsert]; 
    // set the default dates 
    NSDate* date = [NSDate date]; 
    self.timestamp = date; 
    //allow any future modifications to change the timestamp 
    _finishedStartup = YES; 
} 

- (void) awakeFromFetch 
{ 
    [super awakeFromFetch]; 
    // we should already have creation and modified dates. 
    _finishedStartup = YES; 
} 

- (void) didChangeValueForKey: (NSString *) thisKey 
{ 
    [super didChangeValueForKey: thisKey]; 

    if(![thisKey isEqualToString:@"timestamp"] && // prevent infinite loop 
     ![self isFault] && 
     ![[[self managedObjectContext] undoManager] isUndoing] && 
     _finishedStartup) // ensures we arent being called by the object being loaded from fetched data. 
    { 
     self.timestamp = [NSDate date]; 
    } 
}