所以这是我的问题。在我的应用程序主页中,我有一个简单的UITableView,最多可以容纳3个部分,2个部分,每个部分最多包含3个条目,第三个部分最多可以容纳6个条目。
每个节都有一个与之关联的标题。
实际内容来自web,我发出请求,服务器发送数据,我用NSXMLParser解析响应,创建数组来保存每个部分(3个数组)的数据,并创建另一个数组来保持我必须显示的部分的引用。
最后,我调用myTableView reloadData刷新内容和重绘表。用户还可以自己刷新内容。为此,我使用了一种像Facebook应用程序一样的拉式刷新机制。
使用即插即用刷新的刷新内容最终也会调用myTableView reloadData。当我刷新我的内容时,这个表需要更改它的布局(例如:该表当前包含所有三个部分,在我reloadData之后它将只显示一个部分),我正在经历一次严重的崩溃。
我使用调试器来追踪问题。以下是我的发现:
我认为这是因为拉式刷新动画“移动”表并显示新的单元格/标题,从而调用上面的内容。
问题是,这会导致可怕的崩溃,因为保存节数据的数组和节数组本身似乎是并发修改的。
当发生这种情况时,委托方法可能在错误的上下文中使用更新/尚未更新的项/节数组。就是说,以前
有机会为更新后的数组正确地更新新结构。
我知道在没有任何代码示例的情况下说来话长,但我想,如果我已经知道了问题(至少我希望我知道),如果有人看到了我的观点,也许有人可以为我指出正确的方向来纠正这个同步问题。
感谢您的阅读!
稍后编辑
我找到了问题所在。我的拉到刷新机制使用了一个stopLoading回调,如下所示:
- (void)stopLoading { isLoading = NO;
// Hide the header
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.3];
[UIView setAnimationDidStopSelector:@selector(stopLoadingComplete:finished:context:)];
self.myTableView.contentInset = UIEdgeInsetsZero;
[refreshArrow layer].transform = CATransform3DMakeRotation(M_PI * 2, 0, 0, 1);
[UIView commitAnimations];}
在某种程度上,我为我的表重置了contentInset,将其设置为UIEdgeInsetsZero。在主线程上返回后台刷新之后,我在stopLoading之前调用了reloadData --在错误的时刻触发了错误的委托回调。
因此,在更改我的表的contentInset和reloadData之间是一个时间问题。
发布于 2011-04-19 11:58:37
听起来,您正在从不同的线程更新用于表视图的数据存储。这不是一个好主意--数据很容易进入不一致的状态,而且您使用的容器可能并不是线程安全的。
正确的方法是只从主线程更新此数据。另外,您可能希望查看插入行等的方法,这些方法使得完全重新加载几乎是不必要的。如果您只想因为新的数据而更新一个单元格,那么只需刷新该单元格。
https://stackoverflow.com/questions/5715785
复制相似问题