iOS加載網(wǎng)絡(luò)GIF圖片和本地圖片

現(xiàn)在的APP不單單是講究功能實(shí)在,還是得看顏值.
下面記錄一下我最近在做一個(gè)顯示GIF的功能列表的時(shí)候,遇到了一些小坑.
測(cè)試demo

主要用到的技術(shù):
  • SDWebImage
  • AssetsLibrary.framework(系統(tǒng)自帶的第三方類(lèi)庫(kù))
  • YYWebImage

我們做iOS開(kāi)發(fā)的,一般遇到加載圖片,都會(huì)想到SDWebImage這個(gè)第三方類(lèi)庫(kù),然而這個(gè)第三方類(lèi)庫(kù)我在實(shí)現(xiàn)對(duì)應(yīng)的代碼邏輯的時(shí)候,發(fā)現(xiàn)并不是很好處理網(wǎng)絡(luò)加載URLgif圖片格式.

1.SDWebImage
  • 傳統(tǒng)的加載
     //傳統(tǒng)意義的加載
     [imgView sd_setImageWithURL:url placeholderImage:nil completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
     imgView.image = image;
     }];
  • 加載本地
//1. 加載本地的gif圖片
     FLAnimatedImageView *imgView = (FLAnimatedImageView*)[cell.contentView viewWithTag:1];
     imgView.contentMode = UIViewContentModeScaleAspectFit;
     
     NSString * bundlePath = [[ NSBundle mainBundle] pathForResource: @ "gifBundle" ofType :@ "bundle"];
     NSString *imgPath= [bundlePath stringByAppendingPathComponent :[NSString stringWithFormat:@"/%ld.gif", indexPath.row+1]];
     
     NSData  *imageData = [NSData dataWithContentsOfFile:imgPath];
     
     imgView.animatedImage = [FLAnimatedImage animatedImageWithGIFData:imageData];

在調(diào)試的時(shí)候,發(fā)行加載本地的沒(méi)有問(wèn)題,也沒(méi)有重用的現(xiàn)象出現(xiàn),也沒(méi)有卡頓.所以我們就打算采用這個(gè)加載網(wǎng)絡(luò)URL的GIF圖片.

  • 加載url的gif
 //2. 加載url gif 圖片 (需要在故事板設(shè)置imageview的類(lèi)型為FLAnimatedImageView)
     FLAnimatedImageView *imageView = (FLAnimatedImageView*)[cell.contentView viewWithTag:1];
    NSDictionary *dic = listArray[indexPath.row];
    NSURL *url = [NSURL URLWithString:[dic valueForKey:@"GIFImageURL"]];
    imageView.image = [UIImage imageNamed:@"專(zhuān)注.jpg"];
    
    [self loadAnimatedImageWithURL:url completion:^(FLAnimatedImage *animatedImage) {
        imageView.animatedImage = animatedImage;
    }];

異步加載

- (void)loadAnimatedImageWithURL:(NSURL *const)url completion:(void (^)(FLAnimatedImage *animatedImage))completion
{
    NSString *const filename = url.lastPathComponent;
    NSString *const diskPath = [NSHomeDirectory() stringByAppendingPathComponent:filename];
    
    NSData * __block animatedImageData = [[NSFileManager defaultManager] contentsAtPath:diskPath];
    FLAnimatedImage * __block animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:nil];
    
    if (animatedImage) {
        if (completion) {
            completion(animatedImage);
        }
    } else {
        [[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            animatedImageData = data;
            animatedImage = [[FLAnimatedImage alloc] initWithAnimatedGIFData:animatedImageData];
            if (animatedImage) {
                if (completion) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        completion(animatedImage);
                    });
                }
                [data writeToFile:diskPath atomically:YES];
            }
        }] resume];
    }
}

我們發(fā)現(xiàn),按照他們的使用方法來(lái)實(shí)現(xiàn)的時(shí)候,發(fā)行出現(xiàn)稍微卡頓和重用的bug.但是我們還沒(méi)放棄,我們想按照加載本地的方法來(lái)加載試試.
這個(gè)時(shí)候引入類(lèi)庫(kù):AssetsLibrary

FLAnimatedImageView *imgView = (FLAnimatedImageView*)[cell.contentView viewWithTag:1];
    imgView.contentMode = UIViewContentModeScaleAspectFit;

    ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];


    void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset) {
        if (asset != nil) {

            ALAssetRepresentation *rep = [asset defaultRepresentation];
            Byte *imageBuffer = (Byte*)malloc(rep.size);
            NSUInteger bufferSize = [rep getBytes:imageBuffer fromOffset:0.0 length:rep.size error:nil];
            NSData *imageData = [NSData dataWithBytesNoCopy:imageBuffer length:bufferSize freeWhenDone:YES];
            FLAnimatedImage *i =  [FLAnimatedImage animatedImageWithGIFData:imageData];

            imgView.animatedImage = i;
        }
        else {
        }
    };

    [assetLibrary assetForURL:url
                  resultBlock:ALAssetsLibraryAssetForURLResultBlock
                 failureBlock:^(NSError *error) {

                 }];

    */

結(jié)果發(fā)現(xiàn)可以加載出來(lái),但是GIF圖片不動(dòng)!!
所以我們上網(wǎng)查找了相關(guān)資料,發(fā)行了使用YYWebImage效果更好,更加容易實(shí)現(xiàn).

PS:為什么使用FLAnimatedImageView,是因?yàn)镾DWebImage之前的UIImage+GIF不在處理gif,而是交給FLAnimatedImage來(lái)處理
具體導(dǎo)入直接 pod 'SDWebImage/GIF'即可
FLAnimatedImage源代碼

2.YYWebImage

YYWebImage使用起來(lái)很簡(jiǎn)單
pod 'YYWebImage'
在使用界面引入#import "YYWebImage.h"即可

    /*
     //YYWebImage 使用
     YYAnimatedImageView *imageView = (YYAnimatedImageView*)[cell.contentView viewWithTag:1];
     imageView.yy_imageURL = url;
     */

其中還有很多的加載方式和樣式,大家有時(shí)間可以去嘗試.
參考資源:

  1. SDWebImage播放GIF存在的問(wèn)題告组,以及解決辦法
  2. iOS 幾種圖片或Gif異步加載
  3. iOS開(kāi)發(fā)gif圖片轉(zhuǎn)成NSData
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桨醋,一起剝皮案震驚了整個(gè)濱河市栋豫,隨后出現(xiàn)的幾起案子晌端,更是在濱河造成了極大的恐慌,老刑警劉巖婉陷,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帚称,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡憨攒,警方通過(guò)查閱死者的電腦和手機(jī)世杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肝集,“玉大人瞻坝,你說(shuō)我怎么就攤上這事⌒诱埃” “怎么了所刀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)捞挥。 經(jīng)常有香客問(wèn)我浮创,道長(zhǎng),這世上最難降的妖魔是什么砌函? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任斩披,我火速辦了婚禮溜族,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垦沉。我一直安慰自己煌抒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布厕倍。 她就那樣靜靜地躺著寡壮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讹弯。 梳的紋絲不亂的頭發(fā)上况既,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音组民,去河邊找鬼棒仍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛邪乍,可吹牛的內(nèi)容都是我干的降狠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庇楞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了否纬?” 一聲冷哼從身側(cè)響起吕晌,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎临燃,沒(méi)想到半個(gè)月后睛驳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膜廊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年乏沸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪瓜。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹬跃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铆铆,到底是詐尸還是另有隱情蝶缀,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布薄货,位于F島的核電站翁都,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谅猾。R本人自食惡果不足惜柄慰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一鳍悠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坐搔,春花似錦贼涩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至占锯,卻和暖如春袒哥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背消略。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工堡称, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艺演。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓却紧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親胎撤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晓殊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件伤提、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評(píng)論 4 62
  • 一個(gè)月又過(guò)去了一半了巫俺,時(shí)間過(guò)的很快,八月八日晚上九寨溝地震了肿男,四川這個(gè)美麗得天府之國(guó)介汹,又一次的給我們帶來(lái)了震撼汶川...
    遇見(jiàn)繼承閱讀 87評(píng)論 0 0
  • 作為獨(dú)生一代中稀有的"大孩兒",對(duì)現(xiàn)在大孩兒很不理解,雖然一開(kāi)始多了個(gè)弟弟會(huì)不適應(yīng)舶沛,但絕不會(huì)考慮你死我生的問(wèn)題嘹承。父...
    嘿別懶了閱讀 457評(píng)論 0 1
  • 今天是九月五日膀斋,開(kāi)學(xué)三天了爽撒。 相信很多人在高中那種痛苦的生活中鸯乃,大學(xué)生活是熬過(guò)那些苦日子的動(dòng)力辙喂。因?yàn)槲乙彩?..
    成成亦可閱讀 217評(píng)論 0 0
  • 十一月十九日墨爾本晴 最近晚上從圖書(shū)館回來(lái)就困的不行拌滋,很多時(shí)候回來(lái)倒頭就睡了泣懊,一覺(jué)醒來(lái)跟畅,外面的鳥(niǎo)都在嘰嘰喳喳的了棚蓄,...
    青橙miss橙閱讀 380評(píng)論 0 0