锁定和同步问题

时间:2011-10-14 01:44:56

标签: iphone objective-c ipad

我有以下方法:

-(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,我只是想取消这个循环..是否有这样的方法呢?

3 个答案:

答案 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中修改一个数组是不寻常的,但这是我的猜测。