8

最近我正在使用enumerateKeysAndObjectsUsingBlock:,今天当我的一位同事在工作场所指出可以从单独的线程调用此枚举方法并且我的代码可能无法按预期工作时,我犹豫了。他甚至建议我应该使用快速枚举。问题是我真的喜欢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 回答