博客> iOS三种方式加载gif
iOS三种方式加载gif
2017-12-11 23:31 评论:0 阅读:834 tianya2416
sdwebimage gif YYKit

前言

小弟之前在项目中有要求加载gif资源,今天就介绍一下使用是使用三种方式加载gif,写的不好的地方请谅解。

1、使用UIWebView加载gif资源

 __weak WebViewController * weakSelf = self;
    NSURL *URL = [NSURL URLWithString:@"http://112.5.162.246:580/group1/M00/00/14/wKgBBFdhUOyAfeb3AAANWJ1ZYBA442_origin.gif?originSuffix=_origin"];
    NSURLRequest * request = [NSURLRequest requestWithURL:URL];
    NSURLSession * session = [NSURLSession sharedSession];

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        [weakSelf.gifWebView loadData:data MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
    }];
    [task resume];

由于这个 gif图片资源比较大,因此在webview加载gif资源的使用占用了一定的内存了一定的cpu

Enter your link description here:

2、使用SDWebImage加载gif资源

    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.frame = CGRectMake(0, 70, 320, 500);
    [self.view addSubview:imageView];

    NSURL *URL = [NSURL URLWithString:@"http://112.5.162.246:580/group1/M00/00/14/wKgBBFdhUOyAfeb3AAANWJ1ZYBA442_origin.gif?originSuffix=_origin"];
    NSURLRequest * request = [NSURLRequest requestWithURL:URL];
    NSURLSession * session = [NSURLSession sharedSession];

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        UIImage * image = [UIImage sd_animatedGIFWithData:data];
        imageView.image = image;
    }];
    [task resume];

由于这个gif图片资源比较大,因此在SDWebImage加载gif资源的使用占用了大量内存的cpu,但是cpu并没提高多少

 ![ Enter your image description here: ](/Users/weisheng.wang/Desktop/9C228C52-D95A-4A9F-8726-8F16EF73132A.png)

3、使用YYKit加载GIF资源

    YYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] init];
    imageView.frame = CGRectMake(0, 70, 320, 500);
    [self.view addSubview:imageView];
    NSURL *URL = [NSURL URLWithString:@"http://112.5.162.246:580/group1/M00/00/14/wKgBBFdhUOyAfeb3AAANWJ1ZYBA442_origin.gif?originSuffix=_origin"];
    NSURLRequest * request = [NSURLRequest requestWithURL:URL];
    NSURLSession * session = [NSURLSession sharedSession];

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        YYImage * imageV =[YYImage imageWithData:data];
        imageView.image = imageV;
    }];
    [task resume];

由于这个gif图片资源比较大,因此在YYAnimatedImageView加载gif资源的使用占用了较高的cpu,但是内存并没有怎么增加

 Enter your image description here:

总结

通过分析,发现SDWebImage处理gif图片的方法是:将gif资源中每一张imgae写入到内存中,通过animatedImageWithImages的方式播放动画。这样的好处是,gif轮询播放时,直接从内存中取资源就好了,降低了cpu的占用。也就是说,SDWebImage是以空间换取的流畅度。 问题就在这里了,每张image占用内存1.2M,所以此gif中包含58张image,就会占用近70M的内存。当程序中的gif多了,就会出现内存问题,SDWebImage是很占用内存。

YYKit处理gif图片的方法是:每次从缓存的gif中,读取当前需要展示的image,进行动画展示。这样做的好处是,不用为gif的每张image开辟空间了,每次都是从一份gif资源中读取一张image就好了那这个YYKit的cpu问题,也就不言而喻了,以一定的帧率从缓冲中解析出当前需要展示的image,肯定是需要耗用cpu的,YYKit是很吃cpu的。

收藏
0
sina weixin mail 回到顶部