我的tableviewcell图像出现闪烁问题。我知道是什么导致了这个问题,我只是不确定绕过它的最佳方法。
我正在使用Parse。
闪烁是由使用缓存策略CacheThenNetwork引起的,因此查询会检查缓存,然后检查网络是否有任何更改。这会导致查询多次运行,因此会多次调用cellForRowAtIndexPath。
在cellForRowAtIndexPath中,我将图像设置为nil,以避免单元格出列时出现重复图像。这是闪烁发生的主要原因之一,如果没有设置为nil,则每次调用查询时图像都不会消失并再次出现。
所以我的问题是,有没有更好的方法来处理缓存或cellForRowAtIndexPath,以便我可以避免这种明显的闪烁?
我需要使用这个特定的缓存策略,因为它最适合我正在做的事情。我还需要避免重复的图像,因此将图像设置为nil对我来说很有用。如果这是一个更好的方法,请指教!
提前致谢。
以下代码段。
-(void)loadTimeline
{
NSLog(@"Loading timeline");
PFQuery *loadTimeline = [PFQuery queryWithClassName:@"Timeline"];
[loadTimeline whereKey:@"objectId" notEqualTo:@""];
loadTimeline.cachePolicy = kPFCachePolicyCacheThenNetwork;
//[loadTimeline clearCachedResult];
[loadTimeline orderByDescending:@"timestamp"];
[loadTimeline findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
if (!error)
{
_timelineArray = [NSMutableArray new];
// Look through all objects in Timeline table
for (PFObject *object in objects)
{
// For every object in the timeline, check the current user's favourites
for (PFObject *favourite in [[Engine sharedInstance] favouritesArray])
{
if ([[object valueForKey:@"club_objectId"] isEqualToString:[favourite valueForKey:@"club_objectId"]])
{
[_timelineArray addObject:object];
}
}
// If post is a Sporter announcement, add it to the array
if ([[object valueForKey:@"type"] isEqualToString:@"sporter_announcement"])
{
[_timelineArray addObject:object];
}
}
[[self tableView] reloadData];
}
}];
}
在cellForRowAtIndexPath中设置的图像:
// Club badge image
[cell.clubBadgeButton setImage:nil forState:UIControlStateNormal];
PFFile *badgeImageFile = object[@"badge_image"];
[badgeImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
if (!error) {
UIImage *badgeImage = [UIImage imageWithData:imageData];
[cell.clubBadgeButton setImage:badgeImage forState:UIControlStateNormal];
}
}];
答案 0 :(得分:0)
为什么不下载图像一次并存储在应用程序数据存储的缓存文件夹中?这样,您可以避免昂贵的网络调用,每次都获得相同的图像。实现唯一的文件名或其他引用将允许您仅在图像更改时重新下载。否则,它可以由操作系统在本地缓存,只有在系统必须回收空间时才会被清除。