在哪种情况下使用了enumerateKeysAndObjectsWithOptions。为了运行nsdictionary或nsarray的每个对象的代码,我们也可以使用“for in”循环构造然后使用这个方法有什么用。如果我在nsdictionary上使用它,可以使用通过每个对象,它正在改变输出。可能正在应用一些线程概念。任何人都可以解释原因。
这是我使用的简单代码。
NSDictionary *dict=@{@"1":@"india",
@"2":@"uk",
@"3":@"dubai",
@"4":@"china"
};
[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"key is %@",key);
NSLog(@"value is %@",obj);
}];
输出: ]关键是3
键是1
价值是迪拜
键是4
价值是中国
值是印度
键是2
值是英国
答案 0 :(得分:1)
正如苹果医生说的那样
NSEnumerationConcurrent
Specifies that the Block enumeration should be concurrent. The order
of invocation is nondeterministic and undefined; this flag is a hint and
may be ignored by the implementation under some circumstances;
the code of the Block must be safe against concurrent invocation.
他们也说了
This option is available for NSArray and NSIndexSet classes;
its behavior is undefined for NSDictionary and NSSet classes,
or when combined with the NSEnumerationConcurrent flag.
它只表示执行顺序是nondeterministic
和undefined
所以它会同时执行,所以如果你想使用enumeratation
阻止使用- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key,id obj,BOOL *stop))block
NSDictionary *dict=@{@"1":@"india",
@"2":@"uk",
@"3":@"dubai",
@"4":@"china"
};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
NSLog(@"key is %@",key);
NSLog(@"value is %@",obj);
}];
输出将如下所示
key is 3
value is dubai
key is 1
value is india
key is 4
value is china
key is 2
value is uk
正如你所看到的NSDictionary
和NSSet
执行顺序不同,但你可以在这个方法中获得精确的键值对。
了解更多信息Block enumeration operations
NSEnumerationOptions
答案 1 :(得分:1)
如果使用for-in循环,则会获得字典中的每个键。如果您还想要与该键对应的值,则必须在单独的步骤中在字典中查找它。这意味着(一点点)更多的代码,更多的代码总是一个更多错误的机会。此外,它限制了枚举的效率。每个键值对始终需要至少发送一条消息。
使用-enumerateKeysAndObjects...
,您可以获得传递给块的密钥和值。您不必编写代码来使用密钥获取值。代码减少,错误机会减少。此外,界面的设计至少为实现提供了机会以提高效率。任何给定的实现是否实际上比相应的for-in循环更有效是一个悬而未决的问题。但是,即使目前还没有,Apple也可以通过任何版本的操作系统和使用-enumerateKeysAndObjects...
自动获益的应用程序来改进,无需重新编译。
答案 2 :(得分:0)
我不确定NSEnumerationConcurrent选项的确切功能,但您应该尝试使用enumerateKeysAndObjectsUsingBlock:而不是。它将输出交替的键和值。密钥不会以任何特定的顺序排列,但对字典来说是可以预期的。