2011-02-09 12 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]]; 
    } 
} 

私のドリフトを取得しますか?だから、他の高速列挙作業の多くは、容易に

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を使用してそれらを実行しません。

ココア・サムライのとココア・サムライのA Guide to Blocks and GCDを読んで、トピックの詳細をより深く理解することをお勧めします。

+1

+1 GCDに精通していない人には非常に有益です。 –

+5

'-enumerateObjectsUsingBlock:'はGCDを使う理由が全くありません。 GCDを使用する変種は、 '-enumerateObjectsWithOptions:usingBlock:'と 'NSEnumerationConcurrent'オプションが指定されています。 –

+0

そこに行きます。私もそう思っていました。 –

0

This投稿は、あなたや他の人が同様の質問をするのに役立ちます。