8

मेरे पास एक कोर डेटा इकाई है, "बोली", जिसका "आइटम" नामक कई "आइटम" से संबंध है।एक से कई रिश्ते में निर्भर कुंजी का निरीक्षण

आईबी में, मेरे पास "कुल" से जुड़ा एक टेक्स्ट फ़ील्ड है, और यह लगभग काम करता है।

"bid.m" में मेरे पास है:

- (NSDecimalNumber *)total 
{ 
    return [self valueForKeyPath:@"[email protected]"]; 
} 

मैं भी है:

+ (NSSet *)keyPathsForValuesAffectingTotal { 
    return [NSSet setWithObjects:@"itemLink", nil]; 

} 

जोड़ते या अपेक्षा के अनुरूप एक आइटम, "कुल" अपडेट हटा रहा है। लेकिन अगर आप आइटम लिंक्स के सेट में "आइटम" बदलते हैं, तो कुल ताज़ा नहीं हो रहा है। जब आप जुड़े एनएसएसटी में संबंधित ऑब्जेक्ट बदल गए हैं तो यह देखने के लिए केवीओ कैसे मिलता है?

धन्यवाद

उत्तर

7

ऐसा लगता है कि आपकी समस्या तथ्य यह है कि keyPathsForValuesAffectingTotal केवल उल्लेख मुख्यपथ "itemLink" के साथ क्या करना है।

चूंकि यह कई रिश्तों का मार्ग है, इसलिए आप परिवर्तन के लिए एक सेट का निरीक्षण करने के लिए प्रभावी ढंग से अपनी बोली वस्तु को बता रहे हैं। एक सेट जो करता है वह यह प्रबंधित करता है कि वस्तुएं इसके सदस्य हैं या नहीं। इसलिए यह बताता है कि आइटम को "itemLink" से जोड़े या हटाए जाने पर अपडेट क्यों प्राप्त होते हैं, लेकिन केवल यही।

आप इस बात में रुचि नहीं रखते हैं कि कौन से आइटम सेट के सदस्य हैं, फिर भी आप उन सदस्यों के (म्यूटेबल) गुणों में रुचि रखते हैं - इस मामले में कीमत। तो उपर्युक्त के अतिरिक्त, आप "itemLink" के प्रत्येक सदस्य को प्रासंगिक बोली ऑब्जेक्ट की "कुल" कुंजी के सभी पर्यवेक्षकों को सूचित करने के लिए चाहते हैं, जब भी यह "मूल्य" बदल जाता है।

दुर्भाग्यवश, यह आपके बोली वर्ग में एक निर्भर कुंजीपैथ के रूप में "itemLink.price" जोड़ने जैसा आसान नहीं है, क्योंकि केवीओ आपको कई रिश्तों को 'माध्यम' देखने की अनुमति नहीं देता है।

यदि आप अपनी आइटम इकाई के उदाहरणों के लिए एनएसएमएनेज्ड ऑब्जेक्ट सबक्लास का उपयोग करते हैं, तो आप इस कार्यक्षमता को मैन्युअल रूप से जोड़ सकते हैं। कोको को बताने के लिए अपने आइटम क्लास में + automaticallyNotifiesObserversForKey: ओवरराइड करें, आप "मूल्य" कुंजी के लिए मैन्युअल रूप से केवीओ नोटिफिकेशन प्रबंधित करने जा रहे हैं, फिर उचित सूचना भेजते हुए अपनी setPrice: विधि लागू करें। कुछ ऐसा:

- (void)setPrice:(id)inPrice 
{ 
    // bid = inverse relationship of itemLink 
    [[self valueForKey:@"bid"] willChangeValueForKey:@"total"]; 
    [self willChangeValueForKey:@"price"]; 

    [self setPrimitiveValue:inPrice forKey:@"price"]; 

    [self didChangeValueForKey:@"price"]; 
    [[self valueForKey:@"bid"] didChangeValueForKey:@"total"]; 
} 
1

मैंने कई रिश्ते में निर्भर कुंजी का समर्थन करने के लिए कुछ कोड लिखा था।

https://github.com/macoun/DerivedDependency

यह भी परिकलित मानों की कैशिंग का समर्थन करता है।

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