我有一个CollectionView,它显示有关用户的一些信息。其中一个项目是用户头像(100x100 png),它是从我们的网络服务器加载的。问题是,在我看来,当他们走出屏幕区域时,视图会重新加载细胞。每当我滚动页面时,当完全在屏幕区域之外的单元格进入屏幕时,它会滞后一点。这对wifi来说不是一个很大的问题,但在3g上这真的很慢,而且耗费带宽。总的来说,为我的应用处理这样的数据是很糟糕的。我想加载一次数据并显示它,当用户滚动页面时没有数百个webrequests。有没有办法加载一次单元格,并保留它们,直到我手动更新它们?我还没有做任何更新,这是我目前的代码:
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return numContacts;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
UILabel *contactName = (UILabel *)[cell viewWithTag:1];
char *text = contactArray[indexPath.row].name;
contactName.text = [NSString stringWithCString:text encoding:NSASCIIStringEncoding];
NSData * presence = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"offline" ofType:@"png"]];
UIImageView *presenceView = (UIImageView *)[cell viewWithTag:2];
presenceView.image = [UIImage imageWithData: presence];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"myWebServer",text]];
NSData * avatar = [[NSData alloc] initWithContentsOfURL:url];
UIImageView *avatarView = (UIImageView *)[cell viewWithTag:3];
avatarView.image = [UIImage imageWithData: avatar];
NSData *placeholder = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"avatar_unknown" ofType:@"png"]];
[avatarView setImageWithURLRequest:[NSURLRequest requestWithURL:url] placeholderImage:[UIImage imageWithData:placeholder] success:nil failure:nil];
return cell;
}
答案 0 :(得分:0)
您正在加载主队列中的图像数据,因此您将其阻止,因此界面会冻结。
看看这个问题的答案:how to send Asynchronous URL Request?
答案 1 :(得分:0)
我认为你应该在加载View Controller时尝试进行一次异步服务调用以检索数据并存储它(例如在NSMutableArray中),因为每次加载一个单元格时显然都会进行服务调用解。您甚至可以调整您的联系人自定义对象(我假设您已经创建了一个用于存储相关联系信息)以包含用于存储头像图像的图像属性。您无法“加载所有单元格”,因为它们会在屏幕上显示时重新加载。
答案 2 :(得分:0)
我重写了部分代码,因此我可以在开始时检索所有图像,并在我的视图加载时显示它们。这解决了这两个问题。