下载时图像会“闪烁”

时间:2015-03-07 21:32:00

标签: ios objective-c

我有一个从Instagram获取数据的应用程序,并且有一个用户提要,每次用户滚动到底部时都会更新。但是,我注意到,当图像的新部分出现时,它会轻弹'几分之一秒(显示旧照片)。那不好。

显然有很多代码(我不使用像AFNetworking这样的库并使用NSURLSessionDownloadTask),我会粘贴最重要的部分:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:self.urlToPass];
    NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

        NSData *data = [[NSData alloc]initWithContentsOfURL:location];
NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

//... there is the code
        }   else {

            NSArray *newPhotosFromFeed = [responseDictionary valueForKeyPath:@"data"];
            [self.photos addObjectsFromArray:newPhotosFromFeed];
        }


        dispatch_async(dispatch_get_main_queue(), ^{

            [self.collectionView reloadData];
        });

    }];
    [task resume];

我做的是检查我们是否有阵列(旧照片),如果有,我们会向现有照片添加新照片。

这是collectionViewCell的实现:

myCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@" myCell" forIndexPath:indexPath];

if(!cell){

    cell = (myCell *)[myCell cell];
}

cell.photoDictionary = self.photos[indexPath.row];

NSLog(@" Count is %d", [self.photos count]);
return cell;

如何删除那个讨厌的bug?

非常感谢任何建议!

1 个答案:

答案 0 :(得分:1)

假设您发布的用于设置UICollectionViewCell的代码来自您的collectionView: cellForItemAtIndexPath:实施...

相反,如果只在那里设置photoDictionary,您还应该配置单元格的视图。因此,这实际上是您配置单元格应显示的图像的位置。

如果photoDictionary仅包含实际图像的URL,并且单独下载,则可能发生的情况是您的单元格中仍包含旧数据。所以它仍会显示较旧的图像。在这种情况下,您需要设置单元格的图像视图以显示一些占位符图像,或者只显示纯色。

您还可以在单​​元格的prepareForReuse实施中执行上述操作,重置单元格。