0

我有一个问题,我在网络上的任何地方都找不到。我必须显示一些从笔尖加载的自定义单元格。我在一个单独的线程上从我的数据库下载信息并将其分配到一个新的 MutableArray 上。我也有图像分配在一个单独的数组中,并在必要时调用,但不是从网上下载的。向下滚动时,我的表格视图“滞后”,那是(我猜)因为它必须将东西放在正确的单元格上,但是当我向后滚动时它再次滞后并重新加载所有信息。我看到 Facebook 应用程序在向下滚动时加载单元格(但不是那么慢),并且在向后滚动时它不会重新加载任何内容并且单元格已经加载(无论有多少)。我怎么能做这样的事情?我的桌子很慢,我(目前)只有 3 个单元格..

这是我的代码:(这在 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];

那是我的表格视图代码:

- (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;
}
4

2 回答 2

2

您的表格视图如此滞后的原因是,每次表格视图向委托请求单元格(您的cellForRowAtIndexPath方法)时,您都会执行同步网络请求getAddressFromLatLon,从而阻塞主线程。

一个直接的解决方法是- 至少-将这些文本存储在某种数组中,以便下次表格视图请求相同的单元格时,您不必再次执行网络请求。

这将解决当您向上滚动时表格视图滞后的问题,但在您第一次向下滚动时不会。您始终可以认为是正确的一条一般规则是,您永远不应该用网络请求阻塞主线程。

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

Totumus 在他的回答中也有一点,但这不是您滞后的主要原因(尽管一旦您的细胞数量增加,这将是一个大问题)。

于 2013-10-09T09:09:59.313 回答
0

您描述的滞后是由您不断添加到可重用单元格的图像视图引起的。每次单元格重新加载时,都会再次将图像视图添加到您的单元格中。

防止像addSubview:你的cellForRowAtIndexPath:. 相反,您应该创建一个自定义单元格,该单元格已经具有UIImageView您的个人资料图片所需的内容。

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

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

于 2013-10-09T09:06:27.963 回答