2013-03-27 8 views
9

हाय हर साल स्टैक ओवरव्लो पढ़ रहा है, अब मैंने शामिल होने का निर्णय लिया है। मैं इसे हल करने के लिए संघर्ष कर रहा हूं:KVO addObserver CoreData ऑब्जेक्ट के एक-से-कई रिश्ते

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

वर्तमान में मैं यह कर रहा हूं: observeValueForKeyPath कहा जाता हो जाता है

[mydepot addObserver:self forKeyPath:@"Trucks" options:NSKeyValueObservingOptionNew context:nil];

और

[mydepot addObserver:self forKeyPath:@"Persons" options:NSKeyValueObservingOptionNew context:nil];

लेकिन हर कुछ दो संबंधित संग्रह में से एक में बदल जाता है, दो बार (प्रत्येक के लिए एक समय मुख्यपथ)।

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

धन्यवाद, पिएत्रो

संपादित करें: ऐसा लगता है कि दोनों बार "परिवर्तन" शब्दकोष "नया" क्षेत्र में पूरे संबंध होता है। (जाहिर है एक बार व्यक्तियों और एक बार ट्रक)

संपादित 2: क्योंकि यह सरल गुणों को भी सुरक्षित करता है, क्या यह प्रबंधितक्टएक्स सेव ऑपरेशन से संबंधित हो सकता है? जैसे कि जब आप सहेजते हैं, तो संपूर्ण ऑब्जेक्ट को बदला जाता है ..

उत्तर

3

यदि आप परमाणु रूप से ट्रक सेट करते हैं (something.trucks = newArray) आपको एक मूल्य सेट अधिसूचना मिल जाएगी। इसके बजाय [ something mutableArrayValueForKey:@"trucks" ] द्वारा लौटाए गए म्यूटेबल सरणी पर addObject/removeObject का उपयोग करें।

तुम भी उपयोग कर सकते हैं/KVO लागू accessors insertObjectIntoTrucks:/countOfTrucks आदि

आप KVO प्रलेखन पढ़ना चाहिए उत्पन्न। "इंडेक्स टू टू रिलेशन रिलेशनशिप अनुपालन" और "अनियंत्रित टू-रिलेशन रिलेशनशिप अनुपालन" के तहत here

+1

+1 सहमत हैं। पूरे संग्रह को एक अलग संग्रह के साथ बदलने के बजाय मूल्यों के मौजूदा संग्रह को संशोधित करने के संदर्भ में सोचें। – Caleb

+0

धन्यवाद, हाँ, लेकिन डिपो कोरडाटा एनएसएमएनेज्ड ऑब्जेक्ट सबक्लास है इसलिए पहले से ही केवीओ अनुपालन एक्सेसर्स को लागू करना चाहिए। और मैं जो कहता हूं वह कर रहा हूं, तथ्यों के मामले में मैं केवल रिश्ते में एक नई ट्रक इकाई जोड़ रहा हूं, कभी भी पूरे सेट (रिश्ते) को प्रतिस्थापित/स्थापित नहीं कर रहा हूं। यही कारण है कि मैं समझ नहीं सकता। जैसे कि मैं दो कुंजीपैथ का निरीक्षण करता हूं उदाहरण के लिए "ट्रकों" और "वर्गमीटर" (यह कोई रिश्ते नहीं है), यदि "वर्गमीटर" संशोधित किया गया है, तो दो अधिसूचनाएं ट्रिगर होती हैं ("ट्रकों" केपीएथ के लिए भी एक) – Peterdeka

+0

मुख्य पथ इस पर निर्भर हो सकते हैं एक और ... शायद यही हो रहा है? अन्यथा आपको कहीं और – nielsbot

9

कुंजी मान अवलोकन प्रोग्रामिंग मार्गदर्शिका में यह कहते हैं

आप कोर डाटा का उपयोग कर रहे हैं, तो आप अपने प्रबंधित वस्तु संदर्भ से एक पर्यवेक्षक के रूप में आवेदन की अधिसूचना केंद्र के साथ माता-पिता रजिस्टर कर सकते हैं। माता-पिता को बच्चों द्वारा पोस्ट की गई प्रासंगिक परिवर्तन अधिसूचनाओं का जवाब देना चाहिए, जो कि महत्वपूर्ण मूल्य के लिए समान हैं।

कि प्रभावी रूप से मतलब है कि सिफारिश की अभ्यास addObserver:forKeyPath:options:context: उपयोग करने के लिए नहीं है, लेकिन इसके बजाय NSManagedObjectContextDidSaveNotification के लिए रजिस्टर।

+0

हाँ यह मेरी दूसरी पसंद है, क्योंकि मेरे पास एक समय में केवल एक वस्तु है जिसे मैं देखना चाहता हूं (लेकिन कई जो पृष्ठभूमि में संशोधित हो सकते हैं), मुझे लगता है कि यह अधिसूचनाओं का अपशिष्ट है क्योंकि मुझे सभी बदले जाने के लिए अधिसूचित किया गया है ऑब्जेक्ट्स और अधिसूचनाओं को फ़िल्टर करना होगा – Peterdeka

+1

@ पीटरडेका यह अभी भी सबसे अच्छा और सही उत्तर है। आपको इसे स्वीकार करना चाहिए। – Mundi

1

मैं एक ही समस्या के साथ आता हूं। और मैं अभी भी इस समस्या में चिपक रहा हूँ।

लेकिन मुझे यकीन है कि पहली बार यह कहने का कारण है कि आप [Depot addPerson:person] जैसे कुछ करते हैं जबकि दूसरी बार इसे कॉल करने के कारण एमओसी सेव एक्शन NSManagedObjectContextDidSaveNotification अधिसूचना पोस्ट करेगा जो आपको पर्यवेक्षक सोचते हैं कि एक और संशोधन बस होता है।

और मेरी समस्या में और भी बुरा यह है कि पर्यवेक्षक की वजह से, मैं कोर डेटा के कुछ संशोधनों को खो दूंगा।

इससे मुझे लगता है कि मैं लगभग दो दिनों तक इतना बेवकूफ हूं।

मैं @Mundi के जवाब में NSManagedObjectContextDidSaveNotification रजिस्टर का उपयोग करने में सोच रहा हूँ

और अगर किसी को भी एक बेहतर तरीका है, तो कृपया मुझे बताएं यथाशीघ्र

0

मैं कुछ कैश के चारों ओर एक NSManagedObject के गुणों के रूप में रखा और उनको अमान्य करने की आवश्यकता है। मैंने पहली बार केवीओ का उपयोग करने और NSManagedObjectContextDidSaveNotification सुनने में देखा।

मेरे लिए सबसे आसान समाधान – [NSManagedObject didSave] और – [NSManagedObject didTurnIntoFault] इस तरह के तरीकों को लागू करना था।

@interface BazClass() 
@property (nonatomic, strong) NSArray* sortedItems; // sorted items cache 
@end 

@implementation BazClass 

@dynamic items; // this is a to many relationship. i.e. NSOrderedSet 
@synthesize sortedItems; 

- (NSArray*)sortedItems 
{ 
    if (!_sortedItems) { 
     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"foo" ascending:YES]; 
     _sortedItems = [self.items sortedArrayUsingDescriptors:@[sortDescriptor]]; 
    } 
    return _sortedItems; 
} 

// didSave and didTurnIntoFault will delete the sorted items cache 
- (void) didSave 
{ 
    self.sortedItems = nil; 
} 

-(void) didTurnIntoFault 
{ 
    self. sortedItems = nil; 
} 
संबंधित मुद्दे