探究react-native 源碼的圖片緩存-- 自定義圖片緩存

最近一個項目RN版本是0.61此熬,因里面有個圖片瀏覽功能甜刻,要做一個清理緩存的功能呻袭。一番搗鼓后功能解決顿天,記錄如下
找到的清理緩存組建是react-native-http-cache堂氯,因為該組建長期沒人維護android編譯不過,本人又不善長android露氮,遂找了個進化版react-native-http-cache3祖灰。這個在安卓上面需要更改兩個地方才可正常工作,不做討論畔规,本文主要是講ios上面。

iOS在解決了2個bug之后這個組建也能使用恨统,但是發(fā)現(xiàn)ios導給rn的方法getImageCacheSize以及clearImageCache都只是空實現(xiàn)叁扫,沒有具體內(nèi)容。原因下面解釋畜埋。

三年前我寫的分析RN端圖片緩存的策略(http://www.reibang.com/p/c7376db9b7ec)莫绣,當時圖片是沒有磁盤緩存的,內(nèi)存緩存也無效∮瓢埃現(xiàn)在再看下新的RN版本圖片緩存相關(guān)代碼对室,經(jīng)過測試發(fā)現(xiàn),對解壓后2M以內(nèi)的圖片,內(nèi)存緩存生效掩宜。磁盤緩存依舊沒有蔫骂。正因為沒有磁盤緩存,所謂的清理圖片緩存也就不存在牺汤,于是方法為空實現(xiàn)也就能理解了辽旋。

本人項目中有圖片瀏覽功能,當預覽圖片時圖片是高清的原圖檐迟,比較大补胚,按照rn默認的行為圖片不做緩存,那么每次預覽時都會去下載追迟,很緩慢溶其,影響體驗。而且因為圖片遠大于2M內(nèi)存緩存也無法生效敦间,效果很差勁瓶逃。這里需要自定義圖片的緩存

網(wǎng)上搜索了一圈發(fā)現(xiàn)都是解決方案都是使用react-native-img-cache,但是要求使用特定的<CachedImage />圖片組件每瞒,這樣是不太理想的金闽,比如我這里使用的圖片預覽組件,其內(nèi)部使用的是Animate.Image顯示圖片剿骨,總不能去別個組件內(nèi)部更改為CachedImage吧代芜。

翻看RN圖片加載相關(guān)的代碼,發(fā)現(xiàn)了關(guān)鍵地方浓利。在RCTImageLoaderProtocol.h這個圖片加載相關(guān)的協(xié)議里面發(fā)現(xiàn)

/**
 * Allows developers to set their own caching implementation for
 * decoded images as long as it conforms to the RCTImageCache
 * protocol. This method should be called in bridgeDidInitializeModule.
 */
- (void)setImageCache:(id<RCTImageCache>)cache;

很明顯挤庇,這里可以讓開發(fā)者自定義圖片的緩存類,只需實現(xiàn)RCTImageCache協(xié)議即可贷掖。

很簡單嫡秕,我使用SDWebImage實現(xiàn)了這個協(xié)議

#import "PSImageCache.h"
#import <SDWebImage/SDImageCache.h>

@implementation PSImageCache

- (UIImage *)imageForUrl:(NSString *)url
                    size:(CGSize)size
                   scale:(CGFloat)scale
              resizeMode:(RCTResizeMode)resizeMode{
  if (!url) return nil;
  return [[SDImageCache sharedImageCache] imageFromCacheForKey:url];
}

- (void)addImageToCache:(UIImage *)image
                    URL:(NSString *)url
                   size:(CGSize)size
                  scale:(CGFloat)scale
             resizeMode:(RCTResizeMode)resizeMode
               response:(NSURLResponse *)response{
  if (!image || !url) return;
  [[SDImageCache sharedImageCache] storeImage:image forKey:url completion:nil];
}
@end

現(xiàn)在只需要在一個合適的時機,將自定義的PSImageCache類賦值給RCTImageLoader即可苹威。

多方實驗昆咽,如下最佳實踐。在didFinishLaunchingWithOptions中

  // 監(jiān)聽RCTImageLoader模塊加載完畢牙甫,自定義imageCache為sdwebimage緩存圖片
  [[NSNotificationCenter defaultCenter] addObserverForName:RCTDidInitializeModuleNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
    RCTImageLoader *imageLoader = note.userInfo[@"module"];
    if ([imageLoader isKindOfClass:[RCTImageLoader class]]) {
      [imageLoader setImageCache:[PSImageCache new]];
    }
  }];

現(xiàn)在圖片緩存已經(jīng)走Sdwebcache通道了掷酗,一切正常。最上面說的清理緩存的兩個空方法需要更改下窟哺。將Podfile中倒入的react-native-http-cache3刪除泻轰,RNHttpCache文件挪到本地文件,修改getImageCacheSize和clearImageCache方法

RCT_EXPORT_METHOD(getImageCacheSize:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
{
    resolve(@([[SDImageCache sharedImageCache] totalDiskSize]));
}

RCT_EXPORT_METHOD(clearImageCache:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
{
  [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
    resolve(nil);
  }];
}

大功告成且轨!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浮声,一起剝皮案震驚了整個濱河市虚婿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泳挥,老刑警劉巖然痊,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異羡洁,居然都是意外死亡玷过,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門筑煮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛蚊,“玉大人,你說我怎么就攤上這事真仲〈恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵秸应,是天一觀的道長虑凛。 經(jīng)常有香客問我,道長软啼,這世上最難降的妖魔是什么桑谍? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮祸挪,結(jié)果婚禮上锣披,老公的妹妹穿的比我還像新娘。我一直安慰自己贿条,他們只是感情好雹仿,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著整以,像睡著了一般胧辽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上公黑,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天邑商,我揣著相機與錄音,去河邊找鬼凡蚜。 笑死奠骄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的番刊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼影锈,長吁一口氣:“原來是場噩夢啊……” “哼芹务!你這毒婦竟也來了蝉绷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤枣抱,失蹤者是張志新(化名)和其女友劉穎熔吗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佳晶,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡桅狠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轿秧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片中跌。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菇篡,靈堂內(nèi)的尸體忽然破棺而出漩符,到底是詐尸還是另有隱情,我是刑警寧澤驱还,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布嗜暴,位于F島的核電站,受9級特大地震影響议蟆,放射性物質(zhì)發(fā)生泄漏闷沥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一咐容、第九天 我趴在偏房一處隱蔽的房頂上張望舆逃。 院中可真熱鬧,春花似錦疟丙、人聲如沸颖侄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽览祖。三九已至,卻和暖如春炊琉,著一層夾襖步出監(jiān)牢的瞬間展蒂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工苔咪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锰悼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓团赏,卻偏偏與公主長得像箕般,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舔清,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345