我遇到了一个我在网络上找不到的问题。我必须显示从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;
}
答案 0 :(得分:2)
表视图如此滞后的原因是每次表视图向代表询问单元格(您的cellForRowAtIndexPath
方法)时,都会使用getAddressFromLatLon
执行同步网络请求,阻止主线。
立即修复 -at least - 将这些文本存储在某种数组中,以便下次表视图请求相同的单元格时,您不必执行网络请求再次。
这样可以解决当您向上滚动时桌面视图滞后的问题,但是当您第一次向下滚动时则不会。您可以始终认为是一个通用规则,即您不应该使用网络请求阻止主线程。
你现在有两个选择:在一个辅助线程的最开始加载所有这些文本,同时显示一个微调器(很容易但是会出现一些问题,例如它不能很好地扩展到细胞数量)。或者您必须设计一个异步加载器,它将显示占位符字符串,例如loading address...
,直到实际加载地址为止。
Totumus也有他的答案,但这不是导致滞后的主要原因(虽然一旦你的细胞数量增加,这将是一个大问题。)
答案 1 :(得分:0)
您描述的延迟是由您不断添加到可重复使用单元格的imageview引起的。每次单元格重新加载时,imageview都会再次添加到您的单元格中。
在addSubview:
中阻止cellForRowAtIndexPath:
等功能。
相反,您应该创建一个已经具有您的个人资料图片所需UIImageView
的自定义单元格。
滚动时加载信息的原因是,每次创建/重用单元格时,您可能都会加载信息(getAddressFromLatLon:
?)。这很好,但应该在一个单独的线程中完成(因此响应应该异步处理)。
当你再次向上滚动时,你看到facebook不再加载的原因是因为它们在加载到应用程序时缓存了它们的数据。可能与CoreData。