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 不会重新加载数据