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?