Ios Don';返回时重新加载单元格

Ios Don';返回时重新加载单元格,ios,objective-c,uitableview,reload,Ios,Objective C,Uitableview,Reload,我有一个在网络上找不到的问题。我必须显示一些从笔尖加载的自定义单元格。我在一个单独的线程上从数据库下载信息,并将其分配到一个新的可变数组上。 我还有一些图像,它们被分配到一个单独的数组中,并在必要时调用,但不是从web下载的。 当向下滚动时,我的表格视图“滞后”,也就是说(我猜),因为它必须将内容放在正确的单元格中,但当我向后滚动时,它再次滞后,并重新加载所有信息。 我看到Facebook应用程序在向下滚动时加载单元格(但速度不是很慢),而在向后滚动时,它不会加载任何内容,并且单元格已经加载(无

我有一个在网络上找不到的问题。我必须显示一些从笔尖加载的自定义单元格。我在一个单独的线程上从数据库下载信息,并将其分配到一个新的可变数组上。 我还有一些图像,它们被分配到一个单独的数组中,并在必要时调用,但不是从web下载的。 当向下滚动时,我的表格视图“滞后”,也就是说(我猜),因为它必须将内容放在正确的单元格中,但当我向后滚动时,它再次滞后,并重新加载所有信息。 我看到Facebook应用程序在向下滚动时加载单元格(但速度不是很慢),而在向后滚动时,它不会加载任何内容,并且单元格已经加载(无论有多少)。我怎么能做这样的事?我的桌子很慢,我(目前)只有3个房间。。但当应用程序完成时,它们将是100或200。 有人能帮我吗

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


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

cellForRowAtIndexPath:
中阻止类似
addSubview:
的函数。 相反,您应该创建一个自定义单元格,该单元格已经具有您的profilepictures所需的
UIImageView

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


当你再次向上滚动时,你看到facebook不再加载的原因是,当数据加载到应用程序中时,他们会缓存数据。可能与CoreData有关。

表视图之所以如此滞后,是因为每次表视图向代理请求单元格时(您的
cellforrowatinexpath
方法),您都会使用
getAddressFromLatLon
执行同步网络请求,从而阻塞主线程

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

这将解决当您向上滚动时tableview滞后的问题,但当您第一次向下滚动时就不会。一个普遍的规则,你可以一直认为是正确的,就是你不应该用网络请求阻止主线程。 您现在有两个选项:在显示微调器的同时,从一开始就将所有这些文本加载到辅助线程上(很容易,但会出现一些问题,例如它不能很好地与单元格数量进行缩放)。或者,您必须设计一个异步加载程序,它将显示占位符字符串,例如
加载地址…
,直到实际加载地址为止


Totumus的回答也有道理,但这并不是导致延迟的主要原因(尽管一旦单元格数量增加,这将是一个大问题)。

在视图生命周期开始时加载所有数据不是一个用户友好的解决方案。在单元格中加载数据的最佳方法是在后台线程中异步加载。这是为了防止长时间等待和UI阻塞。答案应该被缓存,以防止需要更多的服务器调用。addsubview:call每次重复使用/创建单元格时都会在滚动时产生大量延迟。别忘了,每次当一个新单元进入屏幕时,你都会将图像视图置于另一个图像视图之上。最后,当您滚动几次时,这些子视图的多个层将加载到单元格中。我们可以一致认为,这段代码有两个大问题:)当然。他希望缓存数据,但不知道该过程是如何完成的;)如何缓存数据?我可以解决位置问题,但还有其他问题吗?本地数据库?我不知道如何提高我的应用程序的性能!有什么建议吗?
 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;
}