我正在开发一个解析来自Web服务的数据并在表格视图中显示的项目。一切都很好,但我对tableview的表现不满意。在从Web解析数据后,我调用了重新加载数据来显示数据,但它没有立即显示单元格。它在10/15秒后显示数据。在调用重载数据之前,我已经检查了所有数据的加载。奇怪的是,如果我试图拖动桌子,它会立即显示细胞。
有什么想法吗?
更新
-(void)receivedCategories:(NSMutableArray *)categoryItems{
[self.spinner stopAnimating];
self.categories=categoryItems;
if (self.tableView!=nil) {
[self.tableView reloadData];
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.categories count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CategoryCell";
CategoryCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.category = [self.categories objectAtIndex:indexPath.row];
return cell;
}
CategoryCell.m
@implementation CategoryCell
- (void)setCategory:(Category *)category
{
[self.categoryTitle setText:category.title ];
[self.categorySubTitle setText:category.description];
}
@end
答案 0 :(得分:24)
您似乎没有从主线程调用[self.tableView reloadData];
,这可能是您遇到问题的原因。
你可以尝试:
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
另请查看accepted answer here以获取更多信息。
答案 1 :(得分:1)
我有同样的问题,[tableview reloaddata]和调用方法[cellForRowAtIndexPath]的app之间的时间间隔太长(几秒钟)。将[reloaddata]方法放在<SlidingTabLayout
...
android:background="@color/tabBgColor"
/>
中解决了这个问题。
答案 2 :(得分:1)
您使用的是自定义字体吗?
我有一个非常类似的问题,我的UITableView需要相当长的时间来加载。我终于找到了解决方案,它与我的代码或我加载自定义单元格的方式没有任何关系。
问题发生在运行时,当系统从故事板加载我的自定义UITableViewCells(带有预定义的自定义字体)时,并且因为未正确安装的自定义字体,系统会遍布整个地方查找字体文件,加载文件时造成相当大的延迟。
确保您的字体已正确安装:
找到字体的名称(要找出正确的名称,可以打印所有已安装的字体)
for (NSString* family in [UIFont familyNames]){
NSLog(@"Family %@", family);
for (NSString* name in [UIFont fontNamesForFamilyName: family]){
NSLog(@"\t Font%@", name);
}
}
使用UIFont并指定字体名称
[UIFont fontWithName:@"FONT_NAME" size:size];
答案 3 :(得分:0)
根据您显示的代码量(无),我不得不说您遇到的性能损失是因为您使用大量记录调用reloadData,或者因为您正在花费一些时间来解析/创建单元格时的计算。此外,如果要在这些单元格上显示图像,则可能还会导致性能问题。
答案 4 :(得分:-1)
创建CategoryCell时?在第一次dequeueReusableCell将返回零。然后制作分类单元格。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CategoryCell";
CategoryCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[[CategoryCell alloc] init] autorelease]; }
cell.category = [self.categories objectAtIndex:indexPath.row];
return cell;
}