2011-09-22 6 views
13

मुझे एक शब्दकोश के सभी कुंजी/मूल्य जोड़े को पार करने और दोनों फ़ील्ड के साथ कुछ करने की आवश्यकता है। मैं सोच रहा हूं कि क्या अधिक कुशल है, परंपरागत 'foreach key' दृष्टिकोण या ब्लॉक का उपयोग करके enumerateKeysAndObjectsUsingBlock:।एनएस डिक्शनरी की कुंजी/मानों को ट्रैवर्स करना, enumerateKeysAndObjectsUsingBock लूपिंग कुंजियों और कॉलिंग ऑब्जेक्ट से अधिक कुशल है Forkey :?

पारंपरिक दृष्टिकोण (ब्लॉक से पहले)

for (NSString* key in [self.dictionary allKeys]) { 
    [self processKey:key value: [self.dictionary objectForKey:value ]]; 
} 

ब्लाकों दृष्टिकोण:

यहाँ आप एक उदाहरण है।

[self.dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){ 
     [self processKey:key value:obj]; 
    }]; 

मेरे पेट लग रहा है कि ब्लॉक का उपयोग कुंजी/मान जोड़े traversing तेजी से होता है है, लेकिन मुझे यकीन है कि जब से मैं नहीं जानता कि कैसे शब्दकोशों और विशेष रूप से ब्लॉक विधि कार्यान्वित किया जाता है नहीं कर रहा हूँ।

कोई विचार?

अग्रिम धन्यवाद!

+0

क्या आपका मतलब ऑब्जेक्टफोरकी: ऑब्जेक्ट की बजाय कुंजीफोरकी: मान? – ohthepain

उत्तर

11

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

11

वे मूल रूप से वही होंगे - वे दोनों सिंक्रोनस ट्रैवर्सल हैं। हालांकि, निम्नलिखित समवर्ती ट्रेवर्सल है, जो तेजी से किया जाएगा के लिए अनुमति होगी:

[self.dictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent 
           usingBlock:^(id key, id object, BOOL *stop) { 

}]; 
+1

ब्लॉक पद्धति बड़े शब्दकोशों के साथ काफी तेज है, क्योंकि इसे हर कुंजी से हैश उत्पन्न करने की आवश्यकता नहीं है, जो कि बहुत धीमी है। 'CFStringHashNSString()' यहां देखें: http://opensource.apple.com/source/CF/CF-476.17/CFString.c –

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