2010-10-24 8 views
13

के साथ मूल ऑब्जेक्ट में किसी रिश्ते में ऑब्जेक्ट्स में परिवर्तनों को प्रतिबिंबित करें मेरे पास दो इकाइयां ईवेंट और समय है। ईवेंट इकाई में समय इकाइयों के साथ कई रिश्ते हैं क्योंकि प्रत्येक कार्यक्रम को कई बार किया जा सकता है। अब मैं एक तालिका दृश्य में कालक्रम से सभी घटनाओं को प्रदर्शित करना चाहता हूं। इसलिए मैंने सभी समय ऑब्जेक्ट्स लाने के लिए एक fetchedResultsController सेट अप किया है, उन्हें प्रारंभ समय के अनुसार क्रमबद्ध करें और ईवेंट ऑब्जेक्ट के संबंधों का उपयोग करके ईवेंट जानकारी प्रदर्शित करें। अब तक सब ठीक है। लेकिन अब यदि उपयोगकर्ता तालिका में एक प्रविष्टि टैब करता है तो मैं एक ईवेंट ऑब्जेक्ट को विस्तार से देखता हूं दृश्य कंट्रोलर जहां ईवेंट संपादित किया जा सकता है।NSFetchedResultsController

समस्या यह है कि अब केवल ईवेंट इकाई को अद्यतन के रूप में चिह्नित किया गया है। मुझे NSManagedObjectDidChange अधिसूचना की userInfo निर्देशिका को देखकर यह पता चला। नतीजतन एफआरसी पर प्रतिनिधि विधियों को निकाल दिया नहीं जाता है क्योंकि ऑब्जेक्ट्स को कोई समय नहीं बदला गया है।

एफआरसी परिवर्तनों को पहचानने और तदनुसार कोशिकाओं को अद्यतन करने के लिए मैन्युअल रूप से समय वस्तु को कैसे चिह्नित कर सकता है? मैंने केवीओ विधियों को willChangeValueForKey और didChangeValueForKey पर गोलीबारी करने की कोशिश की लेकिन यह अब तक काम नहीं कर सका।

धन्यवाद थॉमस

+0

जो मैंने अभी कोशिश की है वह मैन्युअल रूप से पोस्ट कर रहा है NSManagedObjectContextObjectDidChangeNotifications एक नए उपयोगकर्ता इन्फ्लो डिक्शनरी के साथ जिसमें मैंने टाइम ऑब्जेक्ट्स को शामिल किया जो ईवेंट ऑब्जेक्ट्स के परिवर्तन से प्रभावित होते हैं। दुर्भाग्य से एफआरसी प्रतिक्रिया नहीं करता है। – GorillaPatch

+0

वर्तमान में मैं एक ऐसे मुद्दे के माध्यम से काम कर रहा हूं जहां मैं रिश्ते में किसी संपत्ति के मूल्य के आधार पर दृश्य को सॉर्ट करना चाहता हूं, और मेरा नीचे समाधान पर्याप्त नहीं है। सौभाग्य! एफआरसी हमेशा सिरदर्द होते हैं। – TahoeWolverine

उत्तर

7

मेरा मॉडल थोड़ा अलग है, लेकिन इसे आसानी से आपके लिए अनुवादित किया जा सकता है।
मैं एक पेड़ की तरह संरचना है:

  • तत्व
    • शीर्षक
    • जनक (टू-वन)
  • फ़ोल्डर: तत्व
    • बच्चों (से-अनेक)
  • फ़ाइल: तत्व

जब कोई फ़ाइल जोड़ या हटा दी जाती है, तो कतार में केवल पहला फ़ोल्डर इस परिवर्तन के बारे में अधिसूचित हो जाता है। जब कोई फ़ाइल का शीर्षक बदलता है, तो एक फ़ोल्डर को अधिसूचित नहीं किया जाएगा। इसलिए क्या करना है? और -didChangeValueForKey:
मैं -willChangeValueForKey अधिभावी की कोशिश की मेरी तत्व कक्षा में।

- (void)willChangeValueForKey:(NSString *)key 
{ 
    [super willChangeValueForKey:key]; 
    [self.parent willChangeValueForKey:@"children"]; 
} 

- (void)didChangeValueForKey:(NSString *)key 
{ 
    [super didChangeValueForKey:key]; 
    [self.parent didChangeValueForKey:@"children"]; 
} 

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

+0

इससे क्रैश का एक गुच्छा हुआ जब मैंने इसे अपने जोखिम पर अपने ऐप-उपयोग में जोड़ने का परीक्षण किया। –

+0

एफडब्ल्यूआईडब्ल्यू: यह सही विचार प्रतीत होता है, लेकिन उन तरीकों को ओवरराइड करना सबसे अच्छा है, इसके बजाय आप उन्हें जिस तरह से विधि में बच्चे ऑब्जेक्ट में परिवर्तन करते हैं, उसे कॉल करना: –

+0

मेरा जीवन सहेजा गया :) –

3

बहुत मैं अद्यतन में से कुछ समान प्रकार के माध्यम से अभी रूप में अच्छी तरह काम कर रहा हूँ। जिस तरह से मैंने समस्या से संपर्क किया है।

मान लीजिए कि हम वस्तु एक है, जो आपत्ति उठाने बी बी एक संपत्ति सी हम चाहते हैं कि संपत्ति सी में परिवर्तन FRCS कि लाई गई वस्तु के रूप में एक का उपयोग में परिलक्षित किया जाना है उनके संबंध को भी करते हैं। क्या मैं ऐसा करने के लिए क्या किया वस्तु एक से संपत्ति सेल्सियस तक एक्सेसर परिभाषित करने के लिए किया गया था:

//A.m 
- (void)setC:(int)cValue { 
    [self willChangeValueForKey:@"b"]; 
    self.b.c = cValue 
    [self didChangeValueForKey:@"b"]; 
} 

- (int)c { 
    return self.b.c; 
} 

यह अनुमति प्राप्त प्रकार NSFetchedResultsChangeUpdate साथ एफआरसी कॉलबैक के आधार पर अद्यतन करने के लिए मेरी कोशिकाओं। उम्मीद है कि यह आपकी समस्या को हल करने में मदद करता है।

+0

मैं थोड़ा उलझन में हूँ। आप ए में बी की संपत्ति के सेटटर को परिभाषित करते हैं? निर्भरताओं को स्थापित करने के लिए 'keyPathsForValuesAffectingValueForKey' का उपयोग करने के बारे में आप क्या सोचते हैं? जैसा कि यह यहां किया गया है http://www.cocoabuilder.com/archive/cocoa/220109-nsset-keypathsforvaluesaffectingvalueforkey.html – GorillaPatch

+0

बी में स्पष्ट रूप से इसकी संपत्ति सेट करने की क्षमता है, लेकिन मैंने संपत्ति को ए से भी सेट करने के लिए एक संपत्ति जोड़ा , सुविधा के लिए। यह मेरे मामले में संपत्ति तक पहुंचने में सहायता करता है, लेकिन यह आपके लिए बिल्कुल अलग हो सकता है। फिर भी, जहां भी आप संपत्ति सेट करते हैं, आप इच्छा का उपयोग करने और परिवर्तन करने में सक्षम होना चाहिए। मुझे लगता है कि निर्भरता स्थापित करने का तरीका एक अच्छा विचार है, लेकिन यह सिर्फ मेरे लिए अभ्यास में काम नहीं किया है। – TahoeWolverine

5

@Jenox से जवाब ऊपर सही विचार प्रतीत होता है, लेकिन यह जब भी किसी भी कुंजी बच्चे वस्तु पर बदल जाता है के रूप में वे कहा जाता है उन तरीकों पर हावी नहीं करने के लिए सबसे अच्छा है और शायद प्रदर्शन को प्रभावित और अप्रत्याशित पक्ष का कारण होगा प्रभाव (यह मेरे लिए किया गया)। शायद सबसे अच्छा सिर्फ उन्हें जो कुछ भी विधि आप बच्चे में परिवर्तन करने में कॉल करने के लिए में वस्तु, इस तरह:

- (void)updateFromDictionary:(NSDictionary *)aDictionary { 
    [myParentModel willChangeValueForKey:@"myChildObject"]; 
    [super updateFromDictionary:aDictionary]; 
    [myParentModel didChangeValueForKey:@"myChildObject"]; 
} 

ध्यान दें कि updateFromDictionary मेरी विधियों में से एक है, न कि एक प्रणाली तरीका है।