我有以下方法:
-(void)populateSpotVenueIndex
{
@synchronized(self.spotsResults) {
[self.pollVenueIndex removeAllObjects];
for (PFObject * poll in self.spotsResults)
{
NSString * venue = [((PFObject *)[poll objectForKey:@"parent"]) objectForKey:@"name"];
[self.pollVenueIndex setObject:venue forKey:[poll objectForKey:@"question"]];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
}
}
给了我:
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x3ec0d0> was mutated while being enumerated.'
*** First throw call stack:
(0x328fc8bf 0x367661e5 0x328fc3e3 0x80eb 0x8787 0x371aed55 0x371ba7a3 0x36e221cf 0x36e220a4)
这怎么可能?基本上我想在这里实现的是,如果循环仍然执行并且调用了populateSpotVenueIndex,我只是想取消这个循环..是否有这样的方法呢?
答案 0 :(得分:2)
我怀疑它与线程或同步有什么关系。它只是意味着你试图在循环中做一些改变数组内容的东西,比如addObject或removeObject。
发布循环体的代码,如果这不能引导您找到解决方案。
答案 1 :(得分:0)
Collection&lt; __ NSArrayM:0x3ec0d0&gt;在被枚举时被突变
这意味着您在枚举时更改了集合数据。
我没有看到你直接改变循环内的spotResults。是否有可能因为其中一个tableView回调中的tableView reloadData而间接更改?
另外,为什么更新循环内的表视图?在循环中更新您的数据,然后调用reloadData ...
答案 2 :(得分:0)
你确定你修改self.spotsResults的其他地方你也使用@synchronized(self.spotsResults)吗?特别是如果你在从reloadData调用的任何代码中修改它(比如cellForRowAtIndexPath)。我想在reloadData中修改一个数组是不寻常的,但这是我的猜测。