溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS YBImageBrowser組件依賴避免沖突的小技巧是什么

發(fā)布時間:2021-11-04 15:17:19 來源:億速云 閱讀:350 作者:iii 欄目:編程語言

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

問題緣由

本文以 YBImageBrowser組件舉例。

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

嚴格的版本限制

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

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

這樣做的好處是限制足夠小版本范圍,降低 SDWebImage 接口變動導致組件代碼錯誤的風險。但如果 SDWebImage 升級到 5.1.0,不管相關 API 是否變動,CocoaPods 都視為依賴沖突。

其它組件依賴了不同版本的 SDWebImage

當兩個組件依賴了同一個組件的不同版本,并且依賴的版本沒有交集,比如:

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

那么 A 和 B 同時集成進項目會出現(xiàn)依賴沖突。

解決方案

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

更模糊的版本限制

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

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

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

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

避免依賴沖突的暴力方案

當有其它組件依賴了不同版本的 SDWebImage,粗暴的解決方案如下:

? 直接修改其它組件依賴的 SDWebImage 版本。

? 將 YBImageBrowser 手動導入項目,并且修改代碼去適應當前的 SDWebImage 版本。

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

顯然,上面的幾種方案不太優(yōu)雅,手動導入項目難以享受組件的更新優(yōu)化,修改本地 repo 信息會因為 repo 列表的更新而復位。

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

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

要做到的目標是,既滿足部分用戶快速集成組件,又能讓部分用戶解決依賴沖突的前提下保證能享受組件將來的更新優(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

由此,用戶可以自由的選擇是否需要依賴 SDWebImage,在 Podfile 里的觀感大致是這樣:

// 依賴 SDWebImagepod 'YBImageBrowser'// 不依賴 SDWebImagepod 'YBImageBrowser/NOSD'

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

第一步是設計一個抽象接口(這個接口不依賴 SDWebImage):

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

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

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

第三步是實現(xiàn)一個默認的中介者(這個類依賴了 SDWebImage):

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

第四步是在內部代碼中通過條件編譯導入并初始化默認中介者:

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

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

由此便實現(xiàn)了目標:

? 用依賴 SDWebImage 的集成方式快速集成。

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

到此,關于“iOS YBImageBrowser組件依賴避免沖突的小技巧是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI