清除UITableView缓存

时间:2014-04-13 09:59:39

标签: ios uikit

我的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];
        }
    );

});

我在桌面视图中得到的奇怪输出:
新行1 新行2 老行3
老行4
Old Row 5

2 个答案:

答案 0 :(得分:4)

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

你应该更新 而是在后台线程中使用单独的数组,然后将其分配给数据 主线程上的源数组:

// ... compute newArray ...

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

答案 1 :(得分: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];
});