2014-04-13 193 views
1

我的UITableView数据源根据用户操作在后台线程中得到更新。我在前景中重新显示细胞。问题是如果新数据中的行数小于以前数据中的行数,我仍然可以在新行之后看到列出的旧行。清除UITableView缓存

15-20秒后,这些旧行会自动删除(有时会更快)。或者,如果我转到不同的屏幕并回到我的tableview(数据源不变),旧的行不再存在。我的猜测是有一些缓存需要强制删除。任何想法如何做到这一点?

这里是我的代码快照

dispatch_async(queue, ^{ 
    LoadingCompleted = NO; 
    if ([lbl.text isEqualToString:@""]) 
    { 
     [self getData:month Year:year]; 
     LoadingCompleted = YES; 
    } 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (LoadingCompleted) { 
      mainDataSource = mainDataSourceCopy; 
      [self.tableView reloadData]; 
     } 
    ); 

});

,我在我的tableview我得到

古怪的输出:
新行1
新行2
旧行3
旧行4
旧行5

回答

1

上表视图使用-reloadData

[tableView reloadData]; 

编辑: 我注意到,你说你更新后台线程,所以以防万一使用performSelectorOnMainThread:withObject:waitUntilDone:

[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

或者你可以使用GCD的dispatch_async()

dispatch_async(dispatch_get_main_queue(), ^{ 
    // Set new data 
    [tableView reloadData]; 
}); 
+0

我使用dispatch_async。不工作:(。请检查我的代码上面。谢谢。 – user1041086

4

您不得在后台线程中更改数据源数组,因为它可能是从主U访问的 我在修改期间线程。

您应该更新 在后台线程独立阵列代替,然后将其分配到的数据在主线程 源阵列:

// ... compute newArray ... 

dispatch_async(dispatch_get_main_queue(), ^{ 
    // Update data source array and reload table view. 
    self.dataSourceArray = newArray; 
    [self.tableView reloadData]; 
}); 
+0

这个技巧并没有帮助:( – user1041086

+0

@ user1041086:问题可能是在你的getData方法。mainDataSourceCopy是否有正确的内容吗? –

+0

是的内容是正确的。想想 - 当下一个绘图循环开始时,旧的行会被清除,因为它是在我没有碰到任何东西的情况下自动发生的。 – user1041086