NSMutableArray enumerateObjectsUsingBlock 不像 Apple 所说的那样同步

Posted

技术标签:

【中文标题】NSMutableArray enumerateObjectsUsingBlock 不像 Apple 所说的那样同步【英文标题】:NSMutableArray enumerateObjectsUsingBlock is not synchronous as Apple says 【发布时间】: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 只是想告诉你,我在自己的代码中遇到了同样的问题。就在今天,一位同事也发生了这种情况。所以这里有一个问题,这是肯定的。 【参考方案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 部分......只是一个错字。 你可以按照我上面的答案进行测试

以上是关于NSMutableArray enumerateObjectsUsingBlock 不像 Apple 所说的那样同步的主要内容,如果未能解决你的问题,请参考以下文章

将自定义对象存储到 NSMutableArray,然后将此 NSMutableArray 存储到 NSUserDefaults

访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)

在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray

从 NSData 的 NSMutableArray 转换为 NSString 的 NSMutableArray?

如何使用 NSPredicate 从另一个 NSMutableArray 中过滤 NSMutableArray

NSMutableArray基本概念