2012-07-17 18 views
11

के लिए किसी ऑब्जेक्ट का उपयोग करने के लिए मेरे पास Lesson एस का समूह है और कक्षा बहुत बढ़िया काम करती है। एक दृश्य नियंत्रक है जो इन पाठों के साथ काम करता है। इस नियंत्रक को lesson की अपलोड स्थिति जानने की आवश्यकता है, इसलिए हमारे पास Lesson कुंजी के साथ एनएस डिक्शनरी है और NSNumber अपलोड स्थिति का प्रतिशत है।NSDictionary

यह एक समस्या है क्योंकि Lesson डालने के बाद आप प्रगति प्राप्त करने के लिए उसी Lesson (शायद cellForRowAtIndexPath: में) पर एक लुकअप करना चाहते हैं। यह काम नहीं करता है क्योंकि NSDictionary में कुंजी कॉपी की जाती है।

NSNumber *key = [NSNumber numberWithUnsignedInt:[obj hash]]; 
[dict setObject:@"... upload progress" forKey:key]; 

या वहां एक बेहतर दृष्टिकोण:

यह कुछ इस तरह से बचाने के लिए और कुंजी लाने के लिए अच्छे फार्म है?

उत्तर

33

मैंने पहले भी इस तकनीक को कई बार इस्तेमाल किया है, और एक NSValue में प्रमुख वस्तुओं लपेटकर द्वारा महान सफलता मिली है:

NSValue *myKey = [NSValue valueWithNonretainedObject:anInstance]; 
id anItem =[myDict objectForKey:myKey]; 

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html#//apple_ref/occ/clm/NSValue/valueWithNonretainedObject:

(स्वरूपण माफ कर दें; मैं मैं आईफोन पर हूं। मैं बाद में प्रारूपित करूंगा :-)

+0

काम करता है 100%, अब मैं इसका उपयोग कर रहा हूं। धन्यवाद। –

+5

'एनएसएमएपीटेबल 'भी एक विकल्प है। यह एक 'NSDictionary' जैसा व्यवहार करता है लेकिन अन्य विकल्पों के शीर्ष पर इसकी चाबियों के कमजोर संदर्भों की अनुमति देता है। –

+0

मेरे पास नीचे 'NSMapTable' के लिए एक सरल कोड नमूना है। – SmallChess

4

वाक्य से पूरी तरह से जा रहा है: "यह काम नहीं करता है क्योंकि कुंजी को NSDictionary में कॉपी किया गया है।" क्या आपने अपनी पाठ कक्षा में -isEqual: और -hash को लागू करने का प्रयास किया है? मैं यह शर्त लगाने के लिए तैयार हूं कि यदि आप पाठ के लिए उपयोग करते हुए पाठ और प्रतिलिपि में एक प्रतिबिंबित करते हैं तो -isEqual: से YES की तुलना में एक महत्वपूर्ण मूल्यांकन के रूप में, आप ठीक होंगे।

0

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

0
UIView *view = [[UIView alloc] init];   
NSMapTable *dict = [NSMapTable weakToStrongObjectsMapTable]; 
[dict setObject:[NSNumber numberWithInt:1234] forKey:view]; 
NSNumber *x = [table objectForKey:view];