enumerateKeysAndObjectsUsingBlock:我可以确定它是在同一个线程上调用的吗?

时间:2013-10-09 22:05:34

标签: ios objective-c multithreading nsdictionary

最近我正在使用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:

1 个答案:

答案 0 :(得分:8)

如您所见,除非您使用enumerateKeysAndObjectsWithOptions选项致电NSEnumerationConcurrent,否则您可以放心,它们不会同时执行。至于enumerateKeysAndObjects的非并发再现是否在同一个线程上运行(但是,我会下注它),如果它不在同一个队列上运行并不重要,因为这个与您调用枚举方法的线程同步运行。最重要的是,你的同事与线程相关的问题毫无根据。

我会注意到,在我的轶事测试中,这些枚举方法比快速枚举慢。如果速度是最重要的(例如,特别是如果使用巨大的字典/数组),那么您可能希望使用快速枚举。但在大多数情况下,差异并不重要。