2013-10-09 13 views
5

Son zamanlarda enumerateKeysAndObjectsUsingBlock: kullanıyorum ve bugün işyerindeki meslektaşımdan birinin bu numaralandırma yönteminin ayrı iş parçacığından çağrılabileceğine ve kodumun beklendiği gibi çalışmayacağı konusunda tereddüt ettim. Hatta hızlı numaralandırma kullanmamı önerdi. Sorun, enumerateKeysAndObjectsUsingBlock:'u gerçekten seviyorum ve sözlük söz konusu olduğunda doğası gereği hızlı sayımdan hoşlanmam.enumerateKeysAndObjectsUsingBlock: aynı ileti dizisinde çağrıldığından emin olabilir miyim?

benim yöntemi (self.myDictionary boş değil varsayarak)

- (NSArray *)someMethod 
{ 
    __block NSMutableArray *myArray = [NSMutableArray array]; 

    [self.myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
     [myArray addObject:obj]; 
    } 

    return myArray; 
} 

Ben myArray hep beklenen değerler döndürür emin olabilir şöyle baktı ve her zaman birYöntem aynı iş parçacığı üzerinde çağrılacak?

enumerateKeysAndObjectsWithOptions:usingBlock: numaralı bir yöntemin var olduğunu ve NSEnumerationConcurrent numaralı bir seçenekle çağrılmasının birden çok iş parçacığı üzerinde aynı anda numaralandırmayı çalıştırdığının farkındayım.

Ancak enumerateKeysAndObjectsUsingBlock ile ilgili herhangi bir belge bulamıyorum.
Aynı, dizide kullanılan enumerateObjectsUsingBlock: anlamına gelir.

+1

Hızlı sayımın “doğası” ile ilgili olarak ne denli sevmediğinizden emin değilseniz, emin olmadığınız bu yöntemi kullanmak ister misiniz? –

+0

Sipariş, dizinizdeki nesneleri bu blokta nasıl sakladığınız burada önemli midir? – Unheilig

+0

"Doğa" ile, onları sıralayan ve sonra nesneye erişen allKey'leri çağırmaktan bahsediyorum, blok numaralandırmayla bunun dışında kalırsınız. Blok - daha uygun, daha kolay kod ve belki de daha az yazı yazmam. – sumofighter666

cevap

7

enumerateKeysAndObjectsWithOptions seçeneğini NSEnumerationConcurrent seçeneği ile aramadıkça, eşzamanlı olarak gerçekleştirilmeyeceğinden emin olabilirsiniz. enumerateKeysAndObjects'un eşzamanlı olmayan eşleşmesinin aynı iş parçacığı üzerinde çalışıp çalışmadığı (yine de bahse girerim) olsa da, aynı sıra üzerinde çalışıp çalışmadığı gerçekten önemli değil çünkü bu eşzamanlı olarak çalışır numaralandırma yöntemini çağırdığınız iş parçacığına saygı. Alt satırda, iş arkadaşınızın iş parçacığıyla ilgili endişeleri haklı değildir.

Bununla birlikte, anekdot testlerimde bu numaralandırma yöntemlerinin hızlı numaralandırmaya göre daha yavaş olduğunu not etmeliyim. Hız, çok önemli bir çıkarsa (örneğin, özellikle büyük sözlükler/diziler kullanılıyorsa), hızlı numaralandırma kullanmak isteyebilirsiniz. Çoğu senaryoda, fark, malzeme değil.

+1

@Rob'un söylediklerine katılıyorum. EnumerateKeysAndObjectsUsingBlock: 'aslında enumerateKeysAndObjectsWithOptions :Block:' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'i' 'i kullanarak dahili olarak çağırır. – Hejazi

+0

@Hejazi Nasıl keşfettiniz/öğrendiniz? Lütfen biraz daha detaylandırın. Teşekkürler. – Unheilig

+0

@Unheilig Çağrı bloğunu kontrol ederek buldum ve blok yürütüldüğünde kaydeder. – Hejazi

İlgili konular