sum*_*666 7 multithreading objective-c nsdictionary ios
最近我正在使用enumerateKeysAndObjectsUsingBlock:,今天当我在工作场所的一位同事指出这个枚举方法可以从单独的线程中调用并且我的代码可能无法按预期工作时,我犹豫了.他甚至建议我应该使用快速枚举.问题是我非常喜欢enumerateKeysAndObjectsUsingBlock:并且不喜欢快速枚举,因为它涉及字典时的性质.
我的方法看起来如下
- (NSArray *)someMethod
{
__block NSMutableArray *myArray = [NSMutableArray array];
[self.myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[myArray addObject:obj];
}
return myArray;
}
Run Code Online (Sandbox Code Playgroud)
我可以确定myArray将始终返回预期值(假设self.myDictionary不为空)并且它将始终在与someMethod相同的线程上调用吗?
我知道有一个方法enumerateKeysAndObjectsWithOptions:usingBlock:,并使用NSEnumerationConcurrent选项调用它将在多个线程上同时运行枚举.
但我找不到任何有关的文件enumerateKeysAndObjectsUsingBlock.
同样指的是enumerateObjectsUsingBlock:在阵列上使用.
如您所见,除非您enumerateKeysAndObjectsWithOptions使用该NSEnumerationConcurrent选项进行呼叫,否则可以确保它们不会同时执行.至于是否在enumerateKeysAndObjects同一个线程上运行的非并发再现(虽然,我会下注它),如果它不在同一个队列上运行并不重要,因为这是同步运行的到您调用枚举方法的线程.最重要的是,您的同事与线程相关的问题没有任何价值.
不过,我会注意到,在我的轶事测试中,这些枚举方法比快速枚举慢.如果速度是最重要的(例如,特别是如果使用巨大的字典/数组),那么您可能希望使用快速枚举.但在大多数情况下,差异并不重要.