2011-02-09 59 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后可能会帮助你或其他人有类似的问题。