向后滚动时不要重新加载单元格

时间:2013-10-09 08:58:58

标签: ios objective-c uitableview reload

我遇到了一个我在网络上找不到的问题。我必须显示从Nib加载的一些自定义单元格。我在分离的线程上从我的数据库下载信息并将其分配给新的MutableArray。 我还有在单独的数组中分配的图像,并在必要时调用,但不从Web下载。 向下滚动时我的表视图“滞后”,即(我猜)因为它必须将事物放在正确的单元格上,但是当我向后滚动时它再次滞后并再次重新加载所有信息。 我看到Facebook应用程序在向下滚动时加载单元格(但不是那么慢),当向后滚动时它不会重新加载任何内容并且单元格已经加载(无论多少)。我该怎么做这样的事情?我的桌子非常慢,而且我(目前)只有3个单元格..但是当应用程序完成时,这些将是100或200。 任何人都可以帮助我吗?

这是我的代码:(这在viewDidLoad上)

 NSString *strURL = [NSString stringWithFormat:@"..(myurl)..];
// to execute php code
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
// to receive the returend value
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];

if(![strResult isEqualToString:@"0"]) {
    posts = [strResult componentsSeparatedByString:@"^"];
}

immProfilo = [NSMutableArray array];

for (int i = 0; i < [posts count]; i++) {
    NSArray *datiPost = [[posts objectAtIndex:i] componentsSeparatedByString:@"/"];
    FBProfilePictureView *fotoProfiloFB = [[FBProfilePictureView alloc] initWithFrame:CGRectMake(22, 22, 55, 55)];
    fotoProfiloFB.profileID = [datiPost objectAtIndex:1];
    [immProfilo addObject:fotoProfiloFB];
}

[self.postTab reloadData];

这是我的tableview代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)postTab {

return [posts count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = [NSString stringWithFormat:@"%ld_%ld",(long)indexPath.section,(long)indexPath.row];

    PostTabCell *cell = (PostTabCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"PostTabCell" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
    }

    NSString *annuncio = [posts objectAtIndex:indexPath.section];
    datiAnnuncio = [annuncio componentsSeparatedByString:@"/"];

   [cell addSubview:[immProfilo objectAtIndex:indexPath.section]];

    cell.nome.text = [datiAnnuncio objectAtIndex:0];
    cell.location.text = [self getAddressFromLatLon:[[datiAnnuncio objectAtIndex:2] floatValue] withLongitude:[[datiAnnuncio objectAtIndex:3] floatValue]];
    cell.testoPost.text = [datiAnnuncio objectAtIndex:4];

    return cell;
}

2 个答案:

答案 0 :(得分:2)

表视图如此滞后的原因是每次表视图向代表询问单元格(您的cellForRowAtIndexPath方法)时,都会使用getAddressFromLatLon执行同步网络请求,阻止主线。

立即修复 -at least - 将这些文本存储在某种数组中,以便下次表视图请求相同的单元格时,您不必执行网络请求再次。

这样可以解决当您向上滚动时桌面视图滞后的问题,但是当您第一次向下滚动时则不会。您可以始终认为是一个通用规则,即您不应该使用网络请求阻止主线程。

你现在有两个选择:在一个辅助线程的最开始加载所有这些文本,同时显示一个微调器(很容易但是会出现一些问题,例如它不能很好地扩展到细胞数量)。或者您必须设计一个异步加载器,它将显示占位符字符串,例如loading address...,直到实际加载地址为止。

Totumus也有他的答案,但这不是导致滞后的主要原因(虽然一旦你的细胞数量增加,这将是一个大问题。)

答案 1 :(得分:0)

您描述的延迟是由您不断添加到可重复使用单元格的imageview引起的。每次单元格重新加载时,imageview都会再次添加到您的单元格中。

addSubview:中阻止cellForRowAtIndexPath:等功能。 相反,您应该创建一个已经具有您的个人资料图片所需UIImageView的自定义单元格。

滚动时加载信息的原因是,每次创建/重用单元格时,您可能都会加载信息(getAddressFromLatLon:?)。这很好,但应该在一个单独的线程中完成(因此响应应该异步处理)。

当你再次向上滚动时,你看到facebook不再加载的原因是因为它们在加载到应用程序时缓存了它们的数据。可能与CoreData。