由于使用Parse在iOS上进行缓存,图像似乎闪烁

时间:2015-10-26 11:53:50

标签: ios xcode caching parse-platform uiimage

我的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];
            }
        }];

1 个答案:

答案 0 :(得分:0)

为什么不下载图像一次并存储在应用程序数据存储的缓存文件夹中?这样,您可以避免昂贵的网络调用,每次都获得相同的图像。实现唯一的文件名或其他引用将允许您仅在图像更改时重新下载。否则,它可以由操作系统在本地缓存,只有在系统必须回收空间时才会被清除。