【问题标题】:NSMutableArray enumerateObjectsUsingBlock is not synchronous as Apple saysNSMutableArray enumerateObjectsUsingBlock 不像 Apple 所说的那样同步
【发布时间】:2014-01-21 11:08:41
【问题描述】:

这是一个错误吗?

我有这样的台词:

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

     NSLog(@"%d", idx);
}];

NSLog(@"end");

应该这样打印

"0"
"1"
"2"
...
"end"

但是打印出来的样子

"end"
"0"
"1"
"2"
...

Apple 说enumerateObjectsWithOptions:usingBlock: 是同步的,所以“end”不应该在枚举之前打印,对吧?

你们能确认一下吗?

【问题讨论】:

  • 您使用的是enumerateObjectsWithOptions:usingBlock: 还是enumerateObjectsusingBlock:...如果您使用的是withOptions,您指定了哪些选项?
  • 我的经验也是 enumerateObjectsusingBlock: 没有排序(每次调用的顺序不同),所以我也在寻找确认。
  • @L14M333 - 没关系,Apple 说两者都是同步的。顺便说一句,我都试过了。
  • 请在 GitHub 上放一个能重现此问题的示例项目。对上面代码的任何简单测试都会打印正确的输出,因此您的问题中缺少某些内容。如果您可以重现它,您需要在提交雷达时将示例项目发送给 Apple。
  • @RubberDuck 只是想告诉你,我在自己的代码中遇到了同样的问题。就在今天,一位同事也发生了这种情况。所以这里有一个问题,这是肯定的。

标签: ios iphone ipad cocoa-touch enumeration


【解决方案1】:

enumerateObjectsUsingBlock: 绝对是同步的。我刚刚在 CodeRunner 中运行了相同的示例:

NSArray *myArray = @[ @1, @2, @3, @4, @5 ];
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"%d", idx);
}];

NSLog(@"end");

得到以下输出:

0
1
2
3 
4
end

【讨论】:

  • 这太奇怪了,因为我的不是……?
  • 您没有在枚举之前的任何地方打印end?您是否使用enumerateObjectsWithOptions:usingBlock:(如问题底部所述)而不是enumerateObjectsUsingBlock:
  • 不。 END 在枚举后打印。这两种方法我都试过了。没有变化。
  • 应该是这样吗?
  • 不,我刚刚开始了一个新项目,将所有内容复制到该项目中,并且成功了...不要问我为什么。
【解决方案2】:

无法确认这一点,它按预期打印:“0”、“1”、“2”、“结束”。另请注意,您正在打印索引,但您的日志从“1”开始。

【讨论】:

  • 您的打印是否正确???????????我已经修复了 0,1,2 部分......只是一个错字。
  • 你可以按照我上面的答案进行测试
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多