WXImgLoaderProtocol

協(xié)議內(nèi)容

@protocol WXImageOperationProtocol <NSObject>

- (void)cancel;

@end

@protocol WXImgLoaderProtocol <WXModuleProtocol>

/**
 * @abstract Creates a image download handler with a given URL
 *
 * @param imageUrl The URL of the image to download
 *
 * @param imageFrame  The frame of the image you want to set
 *
 * @param options : The options to be used for this download
 *
 * @param completedBlock : A block called once the download is completed.
 *                 image : the image which has been download to local.
 *                 error : the error which has happened in download.
 *              finished : a Boolean value indicating whether download action has finished.
 */
- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)options completed:(void(^)(UIImage *image,  NSError *error, BOOL finished))completedBlock;

@end

使用者1WXNavigationDefaultImpl

if (icon) {
    WXBarButton *button = [WXBarButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(0, 0, 25, 25);
    button.instanceId = param[@"instanceId"];
    button.nodeRef = param[@"nodeRef"];
    button.position = position;
    [button addTarget:self action:@selector(onClickBarButton:) forControlEvents:UIControlEventTouchUpInside];
    
    [[self imageLoader] downloadImageWithURL:icon imageFrame:CGRectMake(0, 0, 25, 25) userInfo:nil completed:^(UIImage *image, NSError *error, BOOL finished) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [button setBackgroundImage:image forState:UIControlStateNormal];
            [button setBackgroundImage:image forState:UIControlStateHighlighted];
        });
    }];
    
    return button;
}

下載button的icon

使用者2WXImageComponent

- (void)updateImage
{
    __weak typeof(self) weakSelf = self;
    dispatch_async(WXImageUpdateQueue, ^{
        [self cancelImage];
        
        void(^downloadFailed)(NSString *, NSError *) = ^void(NSString *url, NSError *error){
            WXLogError(@"Error downloading image:%@, detail:%@", url, [error localizedDescription]);
        };
        
        NSString *imageSrc = weakSelf.imageSrc;
        NSString *placeholderSrc = weakSelf.placeholdSrc;
        
        if (weakSelf.placeholdSrc) {
            WXLogDebug(@"Updating image, component:%@, placeholder:%@ ", self.ref, placeholderSrc);
            weakSelf.placeholderOperation = [[weakSelf imageLoader] downloadImageWithURL:placeholderSrc imageFrame:weakSelf.calculatedFrame userInfo:nil completed:^(UIImage *image, NSError *error, BOOL finished) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    __strong typeof(self) strongSelf = weakSelf;
                    UIImage *viewImage = ((UIImageView *)strongSelf.view).image;
                    if (error) {
                        downloadFailed(placeholderSrc,error);
                        if ([strongSelf isViewLoaded] && !viewImage) {
                            ((UIImageView *)(strongSelf.view)).image = nil;
                        }
                        return;
                    }
                    if (![placeholderSrc isEqualToString:strongSelf.placeholdSrc]) {
                        return;
                    }
                   
                    if ([strongSelf isViewLoaded] && !viewImage) {
                        ((UIImageView *)strongSelf.view).image = image;
                    }
                });
            }];
        }
        if (weakSelf.imageSrc) {
            WXLogDebug(@"Updating image:%@, component:%@", self.imageSrc, self.ref);
            NSDictionary *userInfo = @{@"imageQuality":@(weakSelf.imageQuality), @"imageSharp":@(weakSelf.imageSharp)};
            
            dispatch_async(dispatch_get_main_queue(), ^{
                weakSelf.imageOperation = [[weakSelf imageLoader] downloadImageWithURL:imageSrc imageFrame:weakSelf.calculatedFrame userInfo:userInfo completed:^(UIImage *image, NSError *error, BOOL finished) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        __strong typeof(self) strongSelf = weakSelf;
                        
                        if (weakSelf.imageLoadEvent) {
                            [strongSelf fireEvent:@"load" params:@{ @"success": error? @"false" : @"true"}];
                        }
                        if (error) {
                            downloadFailed(imageSrc, error);
                            return ;
                        }
                        
                        if (![imageSrc isEqualToString:strongSelf.imageSrc]) {
                            return ;
                        }
                        
                        if ([strongSelf isViewLoaded]) {
                            ((UIImageView *)strongSelf.view).image = image;
                        }
                    });
                }];
            });
        }
        if (!weakSelf.imageSrc && !weakSelf.placeholdSrc) {
            dispatch_async(dispatch_get_main_queue(), ^{
                self.layer.contents = nil;
            });
        }
    });
}

實(shí)現(xiàn)

sdk沒有提供默認(rèn)的實(shí)現(xiàn),需要自定義實(shí)現(xiàn)方法喇闸。常見的做法是用SDWebImage這個(gè)第三方庫來做

- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image,  NSError *error, BOOL finished))completedBlock {
    return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:SDWebImageRetryFailed progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        if (completedBlock) {
            completedBlock(image, error, finished);
        }
    }];
}

疑問

  1. imageFrame參數(shù)沒有處理蒸眠。一般可以在completed中對(duì)下載得到的圖片進(jìn)行壓縮什么的漾橙。當(dāng)然,只要資源圖片大小合適更好楞卡,不需要處理也行

  2. 協(xié)議的返回值沒有具體指定霜运,這里只是進(jìn)行了強(qiáng)制轉(zhuǎn)換。真的要
    取消圖片下載蒋腮,具體該怎么操作需要進(jìn)一步細(xì)化淘捡。只是這種情況用到的比較少

@protocol SDWebImageOperation <NSObject>

- (void)cancel;

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市池摧,隨后出現(xiàn)的幾起案子焦除,更是在濱河造成了極大的恐慌,老刑警劉巖作彤,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膘魄,死亡現(xiàn)場離奇詭異乌逐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓣距,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門黔帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹈丸,你說我怎么就攤上這事成黄。” “怎么了逻杖?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵奋岁,是天一觀的道長。 經(jīng)常有香客問我荸百,道長闻伶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任够话,我火速辦了婚禮蓝翰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘女嘲。我一直安慰自己畜份,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布欣尼。 她就那樣靜靜地躺著爆雹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愕鼓。 梳的紋絲不亂的頭發(fā)上钙态,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天闯冷,我揣著相機(jī)與錄音趁啸,去河邊找鬼徒役。 笑死肢预,一個(gè)胖子當(dāng)著我的面吹牛外永,可吹牛的內(nèi)容都是我干的躯泰。 我是一名探鬼主播缤谎,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼炊汹,長吁一口氣:“原來是場噩夢啊……” “哼册着!你這毒婦竟也來了拴孤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤甲捏,失蹤者是張志新(化名)和其女友劉穎演熟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芒粹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年兄纺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片化漆。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡估脆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出座云,到底是詐尸還是另有隱情疙赠,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布朦拖,位于F島的核電站圃阳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏璧帝。R本人自食惡果不足惜捍岳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睬隶。 院中可真熱鬧锣夹,春花似錦、人聲如沸苏潜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窖贤。三九已至砖顷,卻和暖如春贰锁,著一層夾襖步出監(jiān)牢的瞬間赃梧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工豌熄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留授嘀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓锣险,卻偏偏與公主長得像蹄皱,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芯肤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫巷折、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • “這怎么可能崖咨,你的靈魂锻拘,怎么會(huì)是這樣,不……” 她似乎頗為驚訝,鉆入我的軀殼之后就離開了這空蕩蕩的街署拟。我不知道這九...
    邵小妮er閱讀 348評(píng)論 0 1
  • 【永澄老師】公眾號(hào):凡是出現(xiàn)兩次的事情就要考慮系統(tǒng)化婉宰、自動(dòng)化 神奇的功能—自定義短語 這可是我在過去的人生中從沒用...
    小鴉說事閱讀 410評(píng)論 0 0
  • 你知道嗎有一種法術(shù)叫做傷口傳送屬于暗黑治愈系 你到那個(gè)受傷的人身邊握住ta的手認(rèn)真看著ta的眼睛說出專屬的神奇咒語...
    當(dāng)冬夜__漸暖閱讀 359評(píng)論 0 2