我使用UITableView和NSMutableArray来保存数据轨道。在极少数情况下,我在heightForRowAtIndexPath中得到NSRangeException,即使numberOfRowsInSection使用相同的数组,例如:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _listSearchResults.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *data = [_listSearchResults objectAtIndex:indexPath.row];
bool isBanner = (bool) [data objectForKey:@"isBanner"];
if(isBanner)
{
return 160;
}
else
{
return 44;
}
}
有时_listSearchResults会在调用numberOfRowsInSection之后(由于异步调用和大型数据集)而在heightForRowAtIndexPath之前被修改! 你对"锁定"有任何建议吗?数组。这是正确的设计模式吗?
更新:我认为问题在于有多种方法可以更新tableView,从而重新加载数据。当我滚动tableView时,它可以获取更多项目,但我也可以过滤表格单元格(从而对服务器进行新的调用)。
问候。
答案 0 :(得分:0)
我的猜测是cellForRowAtIndexPath有旧数据。原因可能是您在启动时调用reload,然后在数据返回时再次调用,因此基本上您可能在第一次重新加载完成之前调用第二次重新加载,因此可能导致cellForRowAtIndexPath意外运行。
当您以不执行cellForRowAtIndexPath的方式获取新数据时,可以尝试将数据源设置为nil
,并在异步返回数据并重新加载表时将其设置为self
。 / p>
喜欢这个
self.tableView.dataSource = nil
和
self.tableView.dataSource = self
答案 1 :(得分:0)
仅在主线程上更改dataSource。在后台进行服务器调用。当它完成计算你想要新数据源的内容时,然后在主线程上设置dataSource。连同调用重新加载表视图。
答案 2 :(得分:0)
我在崩溃报告中注意到,所有设备的内存都很低,所以我会尝试做一些内存泄漏分析并进行清理。
谢谢大家的建议。