2013-10-09 10 views
5

最近私はenumerateKeysAndObjectsUsingBlock:を使用しています。今日、仕事場の同僚の一人がこの列挙方法を別のスレッドから呼び出すことができ、コードが期待どおりに動作しない可能性があると躊躇しました。彼は私が速い列挙を使うべきだと提案する。問題は私が本当に好きなのはenumerateKeysAndObjectsUsingBlock:であり、その性質上、早い列挙を嫌いです。enumerateKeysAndObjectsUsingBlock:同じスレッドで呼び出されることはありますか?

私の方法は、私はmyarrayのはいつも期待値(self.myDictionaryが空でないと仮定)を返します、それはいつものsomeMethodと同じスレッドで呼び出されることを確認することができます

- (NSArray *)someMethod 
{ 
    __block NSMutableArray *myArray = [NSMutableArray array]; 

    [self.myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
     [myArray addObject:obj]; 
    } 

    return myArray; 
} 

を以下のように見えましたか?

私は方法enumerateKeysAndObjectsWithOptions:usingBlock:があり、NSEnumerationConcurrentオプションで呼び出すと、複数のスレッドで同時に列挙が実行されることを認識しています。

enumerateKeysAndObjectsUsingBlockに関するドキュメントは見つかりませんでした。
アレイで使用されているものはenumerateObjectsUsingBlock:です。

+1

高速列挙の「性質」はあなたが確信しているこの方法をむしろ使用するほど強く嫌いですか? –

+0

このブロック内の配列に物事を保存する順序はここで重要ですか? – Unheilig

+0

「自然」とは、すべてのキーを呼び出して列挙し、オブジェクトにアクセスすることを意味します。ブロック列挙を使用すると、それを避けることができます。ブロック - より便利で簡単なコードで、おそらく私の最後に書いていることはありません。 – sumofighter666

答えて

7

このように、enumerateKeysAndObjectsWithOptionsNSEnumerationConcurrentオプションを指定しない限り、同時に実行されないことが保証されます。 enumerateKeysAndObjectsの非並行レンディションが同じスレッド上で実行されるかどうかについては(ただし、私は賭けたいと思う)、同じキューで実行されなかったかどうかは関係ありません列挙メソッドを呼び出したスレッドを基準にしています。要するに、あなたの同僚のスレッド関連の懸案事項にはメリットがありません。

私の逸話的なテストでは、これらの列挙方法は高速列挙よりも遅いことに注意してください。速度が重要な関心事(例えば、巨大な辞書/配列を使用している場合)の場合は、高速列挙を使用することができます。しかし、ほとんどのシナリオでは、その違いは重要ではありません。

+1

@Robが言ったことに同意します。私は 'enumerateKeysAndObjectsUsingBlock:' 'enumerateKeysAndObjectsWithOptions:usingBlock:'を 'options'パラメータとして' 0'を内部的に渡していると付け加えたいと思います。 – Hejazi

+0

@Hejaziどうやって知りましたか?もう少し詳しく説明してください。ありがとう。 – Unheilig

+0

@Unheiligブロックが実行されたときにコールスタックとレジスタをチェックすることでわかりました。 – Hejazi

関連する問題