2011-09-22 19 views
13

Bir sözlüğün tüm anahtar/değer çiftlerini geçmem gerekiyor ve her iki alanla da bir şeyler yapmam gerekiyor. EnumerateKeysAndObjectsUsingBlock kullanarak daha etkili, geleneksel 'foreach anahtar' yaklaşımı veya blok yaklaşımı nedir merak ediyorum. (Blokların öncesi), anahtarlar döngü ve objectForkey çağrı daha verimli enumerateKeysAndObjectsUsingBlock olan :?

Geleneksel yaklaşım

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

Blokları yaklaşım: Burada

Eğer bir örnek var.

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

İçimdeki his bloğunu kullanarak anahtar/değer çiftlerini kateden hızlı olmasıdır, ama ben sözlükleri ve özellikle blok yöntemi uygulanmaktadır bilmiyorum çünkü emin değilim.

Herhangi bir düşünce?

Şimdiden teşekkürler!

+0

Eğer objectForKey demek musunuz değeri? – ohthepain

cevap

11

Blok tabanlı yöntem kullanmalısınız. Bu daha hızlıdır, shown here. Özellikle, performansı yakalayabilen, değeri almak için sözlükte fazladan bir arama gerektirmez. Ancak, makul büyüklükteki sözlüklerde çalışmadıkça performans kazanımları ihmal edilebilir. anahtarı yerine objectForKey:

11

Bunlar temelde aynı olacaktır - her ikisi de senkron dolaşımları vardır. Bununla birlikte, aşağıdaki gibi daha hızlı olacak eşzamanlı geçişe izin verilebilir:

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

}]; 
+1

Blok yöntemi, büyük anahtar kelimelerle oldukça hızlıdır, çünkü her anahtardan bir karma oluşturulmasını gerektirmez, bu oldukça yavaştır. Burada CFStringHashNSString() işlevine bakın: http://opensource.apple.com/source/CF/CF-476.17/CFString.c –

İlgili konular