[ios]加载到 UICollectionView 的许多 gif

发布时间: 2017/3/28 21:11:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我面临的问题当我下载 gif 图像并将添加到集合视图。 gif 图像下载好,但当我想要非常非常快速滚动它的崩溃

请帮助。我有两个解决方案

    /*
    cellForGif.layer.borderColor = [[UIColor colorWithRed:54.0/255.f green:56.0/255.f blue:67.0/255.f alpha:1.0]CGColor];
    cellForGif.layer.borderWidth = 0.7;
    FLAnimatedImage __block *gifImage = nil;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%li", (long)indexPath.row] ofType:@"gif"]]];

        dispatch_async(dispatch_get_main_queue(), ^{

            cellForGif.gifImage.animatedImage = gifImage;
            cellForGif.linkOnGif = [self.linksArrayOnGifs objectAtIndex:indexPath.row];
           //gifImage = nil;
        });
    });
    return cellForGif;
     */
    cellForGif.layer.borderColor = [[UIColor colorWithRed:54.0/255.f green:56.0/255.f blue:67.0/255.f alpha:1.0]CGColor];
    cellForGif.layer.borderWidth = 0.7;
    FLAnimatedImage *gifImage = nil;
        gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%li", (long)indexPath.row] ofType:@"gif"]]];
            cellForGif.gifImage.animatedImage = gifImage;
            cellForGif.linkOnGif = [self.linksArrayOnGifs objectAtIndex:indexPath.row];
            //gifImage = nil;

    return cellForGif; 

解决方法 1:

你需要改变你的方法。

你要再去设置它们载入所有图片 UICollectionViewCell

让我们说创建 NSArray 包含所有 gif 图像。成功加载图像之后然后设置为单元格。

通过观察直接从您的代码,我看到你从主束在加载图像 cellForItemAtIndexPath 方法。所以很明显,这将需要一些时间非常小 (纳米秒)。但这也是相当大,当有大量的单元格中的数据。

它是可能的线

[NSData dataWithContentsOfFile:[[NSBundle mainBundle]

将返回 nil 当你非常非常快速滚动。

添加的注释,如果它是尚不清楚。

编辑︰

加载背景下的图像中将不会影响对用户界面和滚动会更为畅顺。

此外把 try-catch 块的方法来检查你错过了什么。

    cellForGif.layer.borderColor = [[UIColor colorWithRed:54.0/255.f green:56.0/255.f blue:67.0/255.f alpha:1.0]CGColor];
    cellForGif.layer.borderWidth = 0.7;

    @try {
        FLAnimatedImage __block *gifImage = nil;        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            gifImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%li", (long)indexPath.row] ofType:@"gif"]]];

            dispatch_async(dispatch_get_main_queue(), ^{

                cellForGif.gifImage.animatedImage = gifImage;
                cellForGif.linkOnGif = [self.linksArrayOnGifs objectAtIndex:indexPath.row];
                //gifImage = nil;
            });
        });
    }
    @catch (NSException *exception) {
        NSLog(@"Exception :%@",exception.debugDescription)
    }
赞助商