我正在尝试将一些GCD集成到我的代码中,并且发现严重的瓶颈是我在大型数组中的对象之间执行的气泡比较。这是原始代码:
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]];
}
}
让我的漂移?因此,许多其他快速枚举任务可以通过转换轻松进行GCD。
for (id obj in array)
{
[obj aMessage:stuff];
}
为:
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
[obj aMessage:stuff];
}];
有没有办法将我的前瞻 - sorta-bubble-sorta-algorithm-thing转换为可以提供给GCD块实现的东西?
答案 0 :(得分: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只是使用块来执行)。 NSArray
的{{1}}方法很可能不使用GCD来枚举数组(至少参考文献没有对此进行深入了解,所以请证明我错了),如果确实如此,那不是因为你正在为它提供一个块,而是因为这就是Apple选择实现它的方式。大多数采用块的方法都不使用GCD来执行它们。
我建议您阅读Grand Central Dispatch (GCD) Reference以及Cocoa Samurai A Guide to Blocks and GCD,以便更深入地了解该主题的具体细节。
答案 1 :(得分:0)
This帖子可以帮助您或其他有类似问题的人。