iOSYBImageBrowser組件依賴(lài)避免沖突的小技巧是什么

這篇文章主要介紹“iOS YBImageBrowser組件依賴(lài)避免沖突的小技巧是什么”,在日常操作中,相信很多人在iOS YBImageBrowser組件依賴(lài)避免沖突的小技巧是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”iOS YBImageBrowser組件依賴(lài)避免沖突的小技巧是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

在鎮(zhèn)坪等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供做網(wǎng)站、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需開(kāi)發(fā)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷(xiāo)型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè),鎮(zhèn)坪網(wǎng)站建設(shè)費(fèi)用合理。

問(wèn)題緣由

本文以 YBImageBrowser組件舉例。

YBImageBrowser 依賴(lài)了 SDWebImage,在使用 CocoaPods 集成到項(xiàng)目中時(shí),可能會(huì)出現(xiàn)一些依賴(lài)沖突的問(wèn)題,最近社區(qū)提了多個(gè) Issues 并且在 Insights -> Traffic -> Popular content 中看到了此類(lèi)問(wèn)題很高的關(guān)注度,所以不得不著手解決。

嚴(yán)格的版本限制

一個(gè)開(kāi)源組件的迭代過(guò)程中,保證上層接口的向下兼容就不錯(cuò)了。為了優(yōu)化性能并且控制內(nèi)存,YBImageBrowser 沒(méi)有直接用其最上層的接口,而是單獨(dú)使用了下載模塊和緩存模塊,SDWebImage 的迭代升級(jí)很容易導(dǎo)致筆者的組件兼容不了,所以之前一直是類(lèi)似這樣依賴(lài)的:

s.dependency 'SDWebImage', '~> 5.0.0'

這樣做的好處是限制足夠小版本范圍,降低 SDWebImage 接口變動(dòng)導(dǎo)致組件代碼錯(cuò)誤的風(fēng)險(xiǎn)。但如果 SDWebImage 升級(jí)到 5.1.0,不管相關(guān) API 是否變動(dòng),CocoaPods 都視為依賴(lài)沖突。

其它組件依賴(lài)了不同版本的 SDWebImage

當(dāng)兩個(gè)組件依賴(lài)了同一個(gè)組件的不同版本,并且依賴(lài)的版本沒(méi)有交集,比如:

A.dependency 'SDWebImage', '~> 4.0.0'B.dependency 'SDWebImage', '~> 5.0.0'

那么 A 和 B 同時(shí)集成進(jìn)項(xiàng)目會(huì)出現(xiàn)依賴(lài)沖突。

解決方案

使用 CocoaPods 集成項(xiàng)目非常便捷,對(duì)于組件使用者來(lái)說(shuō),總是想在任何場(chǎng)景下都能輕易集成,并且能在將來(lái)享受組件的更新優(yōu)化,顯然前面提到的問(wèn)題可能會(huì)影響集成的便捷性。

更模糊的版本限制

很多時(shí)候一個(gè)大版本的組件不會(huì)改動(dòng) API,并且對(duì)于社區(qū)流行的組件我們可以寄一定希望于其做好向下兼容,所以放寬依賴(lài)的版本限制能覆蓋將來(lái)更多的版本(規(guī)則參考:podspec dependency[2]):

s.dependency 'SDWebImage', '>= 5.0.0'

為什么不干脆去掉版本限制呢?

因?yàn)?YBImageBrowser 3.x 是基于 SDWebImage 5.0.0 開(kāi)發(fā)的,筆者可以明確不兼容 5.0.0 之前的版本,所以在 SDWebImage 將來(lái)迭代版本出現(xiàn)相關(guān) API 不兼容之前,這個(gè)限制都是“完美”覆蓋所有版本的。

避免依賴(lài)沖突的暴力方案

當(dāng)有其它組件依賴(lài)了不同版本的 SDWebImage,粗暴的解決方案如下:

? 直接修改其它組件依賴(lài)的 SDWebImage 版本。

? 將 YBImageBrowser 手動(dòng)導(dǎo)入項(xiàng)目,并且修改代碼去適應(yīng)當(dāng)前的 SDWebImage 版本。

? 社區(qū)朋友一個(gè) Issue 中提到的方法:在 ~/.cocoapods/repos 目錄下找到 YBImageBrowser 文件夾,更改對(duì)應(yīng)版本的 podspec.json 文件里對(duì) SDWebImage 的依賴(lài)版本。

顯然,上面的幾種方案不太優(yōu)雅,手動(dòng)導(dǎo)入項(xiàng)目難以享受組件的更新優(yōu)化,修改本地 repo 信息會(huì)因?yàn)?repo 列表的更新而復(fù)位。

避免依賴(lài)沖突的優(yōu)雅方案

出現(xiàn)依賴(lài)沖突是必須要解決的問(wèn)題,其它組件依賴(lài)的版本限制可以視為不變量,解決方案可以從組件的制作方面考慮。

要做到的目標(biāo)是,既滿(mǎn)足部分用戶(hù)快速集成組件,又能讓部分用戶(hù)解決依賴(lài)沖突的前提下保證能享受組件將來(lái)的更新優(yōu)化。

答案就是subspec,以下是 YBImageBrowser.podspec 部分代碼(完整代碼[3]):

s.subspec "Core" do |core|core.source_files = "YBImageBrowser/**/*.{h,m}"core.dependency 'SDWebImage', '>= 5.0.0'ends.subspec "NOSD" do |core|core.source_files = "YBImageBrowser/**/*.{h,m}"core.exclude_files = "YBImageBrowser/WebImageMediator/YBIBDefaultWebImageMediator.{h,m}"end

由此,用戶(hù)可以自由的選擇是否需要依賴(lài) SDWebImage,在 Podfile 里的觀(guān)感大致是這樣:

// 依賴(lài) SDWebImagepod 'YBImageBrowser'// 不依賴(lài) SDWebImagepod 'YBImageBrowser/NOSD'

那么在 YBImageBrowser 代碼中應(yīng)該如何區(qū)分是否依賴(lài)了 SDWebImage 并且提供默認(rèn)實(shí)現(xiàn)呢?

第一步是設(shè)計(jì)一個(gè)抽象接口(這個(gè)接口不依賴(lài) SDWebImage):

@protocol YBIBWebImageMediator <NSObject>// Download methode, caching methode, and so on.@end

第二步是在YBImageBrowser.h中定義一個(gè)遵循該接口的屬性:

/// 圖片下載緩存相關(guān)的中介者(賦值可自定義)@property (nonatomic, strong) id<YBIBWebImageMediator> webImageMediator;

第三步是實(shí)現(xiàn)一個(gè)默認(rèn)的中介者(這個(gè)類(lèi)依賴(lài)了 SDWebImage):

@interface YBIBDefaultWebImageMediator : NSObject <YBIBWebImageMediator>@end@implementation YBIBDefaultWebImageMediator//通過(guò) SDWebImage 的 API 實(shí)現(xiàn) <YBIBWebImageMediator> 協(xié)議方法@end

第四步是在內(nèi)部代碼中通過(guò)條件編譯導(dǎo)入并初始化默認(rèn)中介者:

#if __has_include("YBIBDefaultWebImageMediator.h")#import "YBIBDefaultWebImageMediator.h"#endif...#if __has_include("YBIBDefaultWebImageMediator.h")_webImageMediator = [YBIBDefaultWebImageMediator new];#endif

第五步在 YBImageBrowser.podspec 中也可以看到,在不依賴(lài) SDWebImage 的集成方式時(shí)排除了兩個(gè)文件:YBIBDefaultWebImageMediator.{h.m}。

由此便實(shí)現(xiàn)了目標(biāo):

? 用依賴(lài) SDWebImage 的集成方式快速集成。

? 使用不依賴(lài) SDWebImage 的集成方式避免各種情況下的依賴(lài)沖突,但注意這種情況需要自行實(shí)現(xiàn)一個(gè)遵循<YBIBWebImageMediator>協(xié)議的中介者。

到此,關(guān)于“iOS YBImageBrowser組件依賴(lài)避免沖突的小技巧是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

網(wǎng)頁(yè)名稱(chēng):iOSYBImageBrowser組件依賴(lài)避免沖突的小技巧是什么
文章路徑:http://www.muchs.cn/article20/gdgdco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、定制網(wǎng)站、用戶(hù)體驗(yàn)、企業(yè)網(wǎng)站制作、企業(yè)建站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)