2011-04-19 21 views
0

所以这是我的问题。 在我的应用程序的主页我有一个简单的UITableView,可以容纳最多3个部分,2个部分每个最多3个项目,第三部分可以容纳最多6个项目。重装数据同步问题

每个部分都有一个标题与。

实际的内容来自web,我提出请求,服务器发送数据,我用NSXMLParser解析响应,创建数组来保存每个部分的数据(3个数组),并且还创建另一个数组来保存我将不得不展示的部分。

然后,最后,我调用[myTableView reloadData]刷新内容并重绘表格。 用户也可以自行更新内容。为此,我正在使用像Facebook应用程序一样的“拉到刷新”机制。

使用pull-to-refresh刷新内容也最终调用[myTableView reloadData]。 当我刷新我的内容并且表需要更改其布局时(例如:表格当前拥有所有3个部分,并且在我重新装入数据后它将只显示一个部分)时,我正在经历一次令人讨厌的崩溃。

我用调试器来追踪问题。以下是我发现:

  1. 用户向下拉动整个表等50个像素,然后释放
  2. 的动画开始,带来了表“向上”,以容纳320x50的视图中显示一个“加载”消息+动画在桌子上
  3. 刷新触发顶部的UIActivityIndi​​catorView,我做一个后台任务了新的Web服务请求,获取新的数据,分析,更新阵列,终于在主线程中执行reloadData
  4. 在此期间,同时刷新正在做所有我注意到,UITableView STILL发送代理消息到:
    • 的tableView:viewForHeaderInSection:
    • 的tableView:的cellForRowAtIndexPath:

我想,这是因为拉来刷新动画的是 “动作” 表并揭示了新的细胞/头,从而称呼上述。

问题是,这会导致可怕的崩溃,因为保存数据的部分和部分数组本身的数组看起来是同时修改的。

发生这种情况时,委托方法可能会在错误的上下文中使用更新/尚未更新的items/sections数组。也就是说,前

  • numberOfSectionsInTableView:
  • 的tableView:numberOfRowsInSection:

曾经有机会正确更新新的结构更新的阵列。我知道如果我已经知道这个问题(至少我希望我这样做),并且如果有人看到我的观点,也许有人可以指引我朝着正确的方向前进纠正这个同步问题。

感谢您的阅读!

以后编辑

我发现那里的问题了。我拉来刷新机制使用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更改之间的时间问题。

回答

0

听起来好像您正在更新用于不同线程的表视图的数据存储。这不是一个好主意 - 数据可能很容易陷入不一致的状态,而且您正在使用的容器可能无法保证线程安全。

正确的方法是仅从主线程更新此数据。此外,你可能想看看插入行等方法,这使得很少需要完整的重新加载。如果你只是想因为新数据而更新一个单元,那么只需要刷新单元。

+0

嗯,是的。我正在考虑在实际编写问题时更新不同线程中的集合(即NSXMLParser中的didEndDocument:方法)。所以我在readeData之前解析结束之后更新了我的performSelectorOnMainThread方法中的结构。还是一样。 reloadData没有机会更新sourceDelegate,因为其他委托方法是使用更新的结构调用的,但是基于旧的sourceDelegate。 – TeodorC 2011-04-19 15:38:57