2011-02-09 38 views
2

我想一些GCD融入我的代碼,並發現一個嚴重的瓶頸是我在一個大陣列對象之間進行比較的泡沫。這裏是原始代碼:Objective-C的快速計數冒泡排序

NSUInteger count = [arrayToDoWorkOn count]; 
for (int i = 0; i < count; i++) 
{ 
    for (int j = i + 1; j < count; j++) 
    { 
     [[arrayToDoWorkOn objectAtIndex:i] compare:[arrayToDoWorkOn objectAtIndex:j]]; 
    } 
} 

Get my drift?所以很多的其他的快速列舉的任務可以通過轉換

for (id obj in array) 
{ 
    [obj aMessage:stuff]; 
} 

可以很容易地GCD'd:

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ 
    [obj aMessage:stuff]; 
}]; 

有沒有辦法對我先行 - 八九不離十泡-八九不離十算法轉換什麼東西,我可以飼料的GCD塊實施?

+0

這有什麼好做GCD僅幾個街區。 – JeremyP

+0

嘿,無情,如果我的回答回答你的問題,不要忘記標記爲正確的答案! ;) –

+0

WHOOPS。可以發誓我已經做到了。昨天很忙碌。再次感謝。 – Grimless

回答

9

我不會建議實施自己的排序,如果NSArray已經有一個內置的方法,它是將最有可能排序的速度比任何你能想出。你可以使用這個:

NSArray *sortedArray = [arrayToDoWorkOn sortedArrayWithComparator:^(id firstObject, id secondObject) { 
    /* comparison code (e.g. return [[firstObject title] compareTo:[secondObject title]], or something) */ 
}]; 

現在,如果你需要的排序過程中使用的對象,你是在一個泡菜,但我建議考慮各種各樣比冒泡排序更有效(快排序是一個很好的)。


除此之外,我想你對GCD有點困惑。編寫和使用塊本身並不會使用GCD來執行;必須手動完成(嚴格來說,塊只是代碼行的集合,本質上與GCD無關; GCD只是使用塊來執行)。 NSArrayenumerateObjectsUsingBlock:方法最有可能不使用GCD枚舉陣列(至少是參考值給出對此沒有深入瞭解,所以請證明我錯了),如果確實如此,這不是因爲你有塊提供它,而是因爲這就是蘋果選擇實施它的原因。大多數採取塊的方法不使用GCD來執行它們。

我建議您閱讀Grand Central Dispatch (GCD) Reference以及Cocoa Samurai的A Guide to Blocks and GCD以更深入地瞭解該主題的具體內容。

+1

+1對於那些不熟悉GCD的人非常有幫助。 –

+5

'-enumerateObjectsUsingBlock:'完全沒有理由使用GCD。使用GCD的變體是'-enumerateObjectsWithOptions:usingBlock:'並指定了'NSEnumerationConcurrent'選項。 –

+0

我們走了;我也這麼想。 –

0

This後可能會幫助你或其他人有類似的問題。