2022-12-29ios-優(yōu)化加載本地大圖片

這里面使用到了yykit庫(kù)行楞,首先在podfile里面添加庫(kù)

pod 'YYKit'

FGAsyncLoadImgUtil.h頭文件代碼很簡(jiǎn)單

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN

@interface FGAsyncLoadImgUtil : NSObject
+ (void)asyncLoadImgWithimgName:(NSString *)imgName block:(void(^)(UIImage *image))block;
@end

NS_ASSUME_NONNULL_END

FGAsyncLoadImgUtil.m文件蜂桶,主要邏輯是通過(guò)線程異步加載渲染并緩存至內(nèi)存來(lái)完成

#import "FGAsyncLoadImgUtil.h"
#import "YYKit.h"

@interface FGAsyncLoadImgUtil()

@property(nonatomic, strong) NSOperationQueue *operationQueue;
@property(nonatomic, strong) YYThreadSafeDictionary *safeImgDict;

@end

static FGAsyncLoadImgUtil *asyncLoadImgUtil = nil;

@implementation FGAsyncLoadImgUtil

+ (instancetype)shareInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        asyncLoadImgUtil = [[[self class] alloc] init];
    });
    return asyncLoadImgUtil;
}

- (instancetype)init
{
    if (self = [super init])
    {
        // 根據(jù)測(cè)試數(shù)據(jù)以及項(xiàng)目線程控制,自行設(shè)置線程數(shù)量
        NSInteger queueCount = 6;
        self.operationQueue = [[NSOperationQueue alloc] init];
        self.operationQueue.name = @"com.FGAsyncLoadImgUtil.www";
        self.operationQueue.maxConcurrentOperationCount = queueCount;
        self.safeImgDict = [YYThreadSafeDictionary dictionary];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
    }
    return self;
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)didReceiveMemoryWarning
{
    [self.safeImgDict removeAllObjects];
}

+ (void)asyncLoadImgWithimgName:(NSString *)imgName block:(void(^)(UIImage *image))block
{
    [[FGAsyncLoadImgUtil shareInstance] asyncLoadImgWithimgName:imgName block:block];
}

- (void)asyncLoadImgWithimgName:(NSString *)imgName block:(void(^)(UIImage *image))block
{
    if (!imgName || imgName.length == 0)
    {
        return;
    }
    UIImage *image = [self.safeImgDict objectForKey:imgName];
    if (image)
    {
        !block ? :block(image);
    }
    else
    {
        __weak typeof(self)wSelf = self;
        [self.operationQueue addOperationWithBlock:^{
            __strong typeof(wSelf) strongSelf = wSelf;
            UIImage *image = [FGAsyncLoadImgUtil _getDrawImageByName:imgName];
            if (image)
            {
                UIImage *storeImage = [strongSelf.safeImgDict objectForKey:imgName];
                if (!storeImage)
                {
                    [strongSelf.safeImgDict setObject:image forKey:imgName];
                }
                else
                {
                    image = storeImage;
                }
                if (block)
                {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        block(image);
                    });
                }
            }
        }];
    }
}

+ (UIImage *)preDrawImageWithName:(NSString *)name
{
    NSString *imgName = nil;
    UIImage *img = nil;
    if (!name || name.length == 0)
    {
        return img;
    }
    if (3 == [UIScreen mainScreen].scale)
    {
        imgName = [NSString stringWithFormat:@"%@@3x.png",name];
        img = [FGAsyncLoadImgUtil _preDrawImageWithName:imgName];
    }
    if (img==nil)//沒(méi)有3x圖埃疫,可以嘗試獲取2x圖片
    {
        imgName = [NSString stringWithFormat:@"%@@2x.png",name];
        img = [FGAsyncLoadImgUtil _preDrawImageWithName:imgName scale:2.0];
        if (img == nil)
        {
            imgName = [NSString stringWithFormat:@"%@.jpeg",name];
            img = [FGAsyncLoadImgUtil _preDrawImageWithName:imgName scale:1.0];
        }
    }
    return img;
}

+ (UIImage *)_preDrawImageWithName:(NSString *)imgName
{
    NSString *imgPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:imgName];
    NSData *data = [NSData dataWithContentsOfFile:imgPath];
    if (data)
    {
        UIImage *image = [[UIImage alloc] initWithData:data scale:[UIScreen mainScreen].scale];
        image = [image imageByDecoded];
        return image;
    }
    else
    {
        return nil;
    }
}

/**
 根據(jù)指定的scale加載圖片
 */
+ (UIImage *)_preDrawImageWithName:(NSString *)imgName scale:(CGFloat)scale
{
    NSString *imgPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:imgName];
    NSData *data = [NSData dataWithContentsOfFile:imgPath];
    if (data)
    {
        UIImage *image = [[UIImage alloc] initWithData:data scale:scale];
        image = [image imageByDecoded];
        return image;
    }
    else
    {
        return nil;
    }
}


+ (UIImage *)_getDrawImageByName:(NSString *)imgName
{
//    NSString *imgPath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:imgName];
    NSData *data = [NSData dataWithContentsOfFile:imgName];
    if (data)
    {
        UIImage *image = [[UIImage alloc] initWithData:data scale:[UIScreen mainScreen].scale];
        image = [image imageByDecoded];
        return image;
    }
    else
    {
        return nil;
    }
}
@end

最后是調(diào)用,調(diào)用很簡(jiǎn)單巩螃,在block回調(diào)里面設(shè)置圖片

    [FGAsyncLoadImgUtil asyncLoadImgWithimgName:self.localPath block:^(UIImage * _Nonnull image) {
        [self.backGroundImage setImage:image];
    }];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甚淡,一起剝皮案震驚了整個(gè)濱河市大诸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贯卦,老刑警劉巖资柔,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脸侥,居然都是意外死亡建邓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門睁枕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)官边,“玉大人,你說(shuō)我怎么就攤上這事外遇∽⒉荆” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵跳仿,是天一觀的道長(zhǎng)诡渴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)菲语,這世上最難降的妖魔是什么妄辩? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮山上,結(jié)果婚禮上眼耀,老公的妹妹穿的比我還像新娘。我一直安慰自己佩憾,他們只是感情好哮伟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妄帘,像睡著了一般楞黄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抡驼,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天鬼廓,我揣著相機(jī)與錄音,去河邊找鬼致盟。 笑死碎税,一個(gè)胖子當(dāng)著我的面吹牛柏副,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚣录,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼割择,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了萎河?” 一聲冷哼從身側(cè)響起荔泳,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虐杯,沒(méi)想到半個(gè)月后玛歌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擎椰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年支子,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片达舒。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡值朋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巩搏,到底是詐尸還是另有隱情昨登,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布贯底,位于F島的核電站丰辣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏禽捆。R本人自食惡果不足惜笙什,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胚想。 院中可真熱鬧琐凭,春花似錦、人聲如沸顿仇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臼闻。三九已至,卻和暖如春囤采,著一層夾襖步出監(jiān)牢的瞬間述呐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蕉毯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乓搬,地道東北人思犁。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像进肯,于是被迫代替她去往敵國(guó)和親激蹲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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