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することができます

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ブロック実装にフィードできるものに変換する方法はありますか?

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)リファレンスとCocoaSamuraiのAGuide to BlocksandGCDを読むことをお勧めします。

于 2011-02-09T02:44:39.807 に答える