UITableView 两次重新加载数据,但没有正确显示数据

Posted

技术标签:

【中文标题】UITableView 两次重新加载数据,但没有正确显示数据【英文标题】:UITableView reloads data twice, but does not show data properly 【发布时间】:2015-06-25 21:52:23 【问题描述】:

我正在调用两个 web 服务,并且我在一个 tableview 中显示这两个内容。因为我是异步调用的,所以我想先加载数据,然后在第二个服务完成时再次调用。这些服务的响应被插入到它们自己单独的部分中,因此我将它们保存在它们各自的 NSarray 中。

A -> TO Web Service -> 响应到达时的 tableView reloadData

B -> 到 Web 服务 -> 响应到达时 tableView reloadData

-(void)UpdateTable

    if (_firstRequest  || _secondRequest)
        runningRefresh = false;
       [self.tableView reloadData];
        [self removeLoading];
    




- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    if (section == 0)
        return 1;
    
    else if (section == 1)
        if (!_firstRequest)
            return 1;
        else
            NSLog(@"SECTION 1");
            if ([self._collectionsNewGame isKindOfClass:[NSNull class]] || [self._collectionsNewGame count] == 0)
                NSLog(@"0 COUNT");
                return 0;
            
            NSLog(@"%ld COUNT",[self._collectionsNewGame count]);
            return [self._collectionsNewGame count] + 1;
        

    
    else if (section == 2)
        if (!_thirdRequest)
            return 1;
        else
            if ([self._collectionsRandom isKindOfClass:[NSNull class]] || [self._collectionsRandom count] == 0)
                return 0;
            
            return [self._collectionsRandom count] + 1;
        

    
    else return 0;
     //count number of row from counting array hear cataGorry is An Array

我只是在 cellrowatindexpath 中阅读并显示它。

但是,当我这样做时,有些行中的单元格没有出现并且行为怪异。知道如何做到这一点吗?

【问题讨论】:

您需要提供更多代码。具体来说,我们需要查看提供单元格的UITableViewDataSource 方法。 名称以小写字母开头,嵌入单词的首字母大写。 Apple Coding Guidelines 【参考方案1】:

如果您只想将行添加到您的UITableView 而不是使用reloadData,则将这些服务的响应整合到一个数据源中,可以说NSArray 在需要的地方使用insertRowsAtIndexPaths: withRowAnimation : 插入行。确保你有正确的验证

Here is the apple reference

最后使用主队列执行UITableview更新

[self performSelectorOnMainThread:@selector(updateTable) 
                   withObject:object 
                waitUntilDone:YES]

通过将YES 传递给waitUntilDone,您将阻塞该方法已完成的主线程。

同样的方式你可以使用

[[NSOperationQueue mainQueue] addOperationWithBlock:^
    [self updateTable];
];  

不同的是,这种方法不能保证updateTable 何时会被执行。该队列中可能还有其他项目仍在等待执行。

【讨论】:

我的问题不是很清楚,对此我很抱歉。这些服务的响应被插入到它们自己单独的部分中,因此我将它们保存在它们各自的 NSarray 中。我不确定如何在这种情况下使用您的解决方案? 你面临的问题是你正在异步更新你的 tableview 这意味着当服务 A 完成时,在 tableview 更新的中间没有 tableView 的锁定,所以它可以结束更新,然后从下一个服务开始任何更新。现在,如果您使用两个不同的数组,您将如何处理 UITableViewDataSource 方法中的逻辑?如果您可以共享该代码以便我们理解这一点,将会非常有用。 现在请记住 reloadData 会从表中删除所有 UITableViewCell 视图。重新绘制表时调用数据源委托方法。因此,这是一个异步任务,但有些方法被称为同步,因此节数、行数和行高会立即更新。 这是我的第一个应用程序,因此我不知道 reloadData 会删除所有单元格。我添加了行数部分,希望能帮助您了解我在做什么 我看到的第一件事是你使用NSNull 来检查你的NSArray,据Apple 说,NSNull 类定义了一个单例对象,用于在 nil 为空的情况下表示空值禁止作为值(通常在集合对象中,例如数组或字典)。 NSNull 实例在语义上等价于nil,但同样重要的是要认识到它不等于nil。在此处查看更多信息Using NSNull

以上是关于UITableView 两次重新加载数据,但没有正确显示数据的主要内容,如果未能解决你的问题,请参考以下文章

嵌入在 UIStackView 中的 UITableView 不会重新加载数据

重新加载 uitableview 从第二行开始(或不在第一行)

无法重新加载 UITableView

UITableview 没有重新加载

为啥我的函数没有重新加载 UITableView 的数据?

iPhone - UITableView 的问题 - 重新加载数据并且没有命中