8

最近私は使用enumerateKeysAndObjectsUsingBlock:していますが、職場の同僚の 1 人がこの列挙メソッドを別のスレッドから呼び出すことができ、私のコードが期待どおりに機能しない可能性があることを指摘したとき、今日は躊躇しました。彼は、高速列挙を使用する必要があるとさえ提案しました。enumerateKeysAndObjectsUsingBlock:問題は、辞書に関しては、その性質上、高速な列挙が本当に好きで嫌いです。

私の方法は次のように見えました

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

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

    return myArray;
}

myArray が常に期待値を返し (self.myDictionary空でないと仮定)、常に someMethod と同じスレッドで呼び出されることを確認できますか?

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

しかし、に関するドキュメントが見つかりませんenumerateKeysAndObjectsUsingBlock。同じことは、配列で使用される
ことを指します。enumerateObjectsUsingBlock:

4

1 に答える 1

8

enumerateKeysAndObjectsWithOptionsご覧のとおり、オプションで呼び出さない限りNSEnumerationConcurrent、それらが同時に実行されないことが保証されます。の非並行レンディションがenumerateKeysAndObjects同じスレッドで実行されるかどうかについては (ただし、私はそうすることに賭けます)、これは同期的に実行されるため、同じキューで実行されなくても問題ありません。列挙メソッドを呼び出したスレッドに。要するに、同僚のスレッド関連の懸念にはメリットがありません。

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

于 2013-10-09T22:46:36.140 に答える