2

我正在尝试将一些 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'd

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

至:

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

有没有办法将我的前瞻排序气泡排序算法转换为我可以提供给 GCD 块实现的东西?

4

1 回答 1

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 来枚举数组(至少参考文献对此没有任何见解,所以请证明我错了),如果确实如此,那不是因为您为它提供了一个块,而是因为这就是 Apple 选择实施它的方式。大多数采用块的方法不使用 GCD 来执行它们。

我建议您阅读Grand Central Dispatch (GCD) 参考以及 Cocoa Samurai 的块和 GCD 指南,以更深入地了解该主题的细节。

于 2011-02-09T02:44:39.807 回答