当单元格移出屏幕时,如何将数据保存在UICollectionView中?

时间:2013-07-22 14:51:49

标签: ios uicollectionview

我有一个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;
}

3 个答案:

答案 0 :(得分:0)

您正在加载主队列中的图像数据,因此您将其阻止,因此界面会冻结。

看看这个问题的答案:how to send Asynchronous URL Request?

答案 1 :(得分:0)

我认为你应该在加载View Controller时尝试进行一次异步服务调用以检索数据并存储它(例如在NSMutableArray中),因为每次加载一个单元格时显然都会进行服务调用解。您甚至可以调整您的联系人自定义对象(我假设您已经创建了一个用于存储相关联系信息)以包含用于存储头像图像的图像属性。您无法“加载所有单元格”,因为它们会在屏幕上显示时重新加载。

答案 2 :(得分:0)

我重写了部分代码,因此我可以在开始时检索所有图像,并在我的视图加载时显示它们。这解决了这两个问题。