enumerateKeysAndObjectsWithOptions未按预期工作

时间:2015-01-23 06:04:38

标签: ios objective-c

在哪种情况下使用了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

值是英国

3 个答案:

答案 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.

它只表示执行顺序是nondeterministicundefined所以它会同时执行,所以如果你想使用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

正如你所看到的NSDictionaryNSSet执行顺序不同,但你可以在这个方法中获得精确的键值对。

了解更多信息Block enumeration operations NSEnumerationOptions

答案 1 :(得分:1)

如果使用for-in循环,则会获得字典中的每个键。如果您还想要与该键对应的值,则必须在单独的步骤中在字典中查找它。这意味着(一点点)更多的代码,更多的代码总是一个更多错误的机会。此外,它限制了枚举的效率。每个键值对始终需要至少发送一条消息。

使用-enumerateKeysAndObjects...,您可以获得传递给块的密钥和值。您不必编写代码来使用密钥获取值。代码减少,错误机会减少。此外,界面的设计至少为实现提供了机会以提高效率。任何给定的实现是否实际上比相应的for-in循环更有效是一个悬而未决的问题。但是,即使目前还没有,Apple也可以通过任何版本的操作系统和使用-enumerateKeysAndObjects...自动获益的应用程序来改进,无需重新编译。

答案 2 :(得分:0)

我不确定NSEnumerationConcurrent选项的确切功能,但您应该尝试使用enumerateKeysAndObjectsUsingBlock:而不是。它将输出交替的键和值。密钥不会以任何特定的顺序排列,但对字典来说是可以预期的。