亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS組件依賴避免沖突的小技巧分享

2020-07-26 02:19:15
字體:
來源:轉載
供稿:網友

問題緣由

本文以 YBImageBrowser[1] 組件舉例。

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

嚴格的版本限制

一個開源組件的迭代過程中,保證上層接口的向下兼容就不錯了。為了優化性能并且控制內存,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 同時集成進項目會出現依賴沖突。

解決方案

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

更模糊的版本限制

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

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

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

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

避免依賴沖突的暴力方案

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

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

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

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

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

避免依賴沖突的優雅方案

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

要做到的目標是,既滿足部分用戶快速集成組件,又能讓部分用戶解決依賴沖突的前提下保證能享受組件將來的更新優化。

答案就是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 代碼中應該如何區分是否依賴了 SDWebImage 并且提供默認實現呢?

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

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

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

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

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

@interface YBIBDefaultWebImageMediator : NSObject <YBIBWebImageMediator>@end@implementation YBIBDefaultWebImageMediator//通過 SDWebImage 的 API 實現 <YBIBWebImageMediator> 協議方法@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}。

由此便實現了目標:

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

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

以上便是避免依賴沖突的小技巧,希望讀者朋友能提出更好的建議或意見😁。

參考

[1]https://github.com/indulgeIn/YBImageBrowser

[2]https://guides.cocoapods.org/syntax/podspec.html#dependency

[3]https://github.com/indulgeIn/YBImageBrowser/blob/master/YBImageBrowser.podspec

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产欧美一区二区三区久久| 91久久夜色精品国产网站| 日韩成人在线视频网站| 亚洲欧美激情视频| 欧美专区在线观看| 欧美激情网站在线观看| 97在线免费观看视频| 欧美性猛交xxxxx免费看| 九九热这里只有精品6| 亚洲区bt下载| 欧美裸体xxxx极品少妇| 国产精品一区二区女厕厕| 777午夜精品福利在线观看| 色妞在线综合亚洲欧美| 国产精品久久久久久久久久99| 亚洲丝袜av一区| 成人网址在线观看| 亚洲老头老太hd| 日日噜噜噜夜夜爽亚洲精品| 97精品国产aⅴ7777| 成人日韩在线电影| 日韩欧美一区二区三区久久| 亚洲精品福利资源站| 中文字幕九色91在线| 欧美精品在线第一页| 亚洲欧美另类在线观看| 久久久久久有精品国产| 日韩av色综合| 欧美一区视频在线| 亚洲午夜色婷婷在线| 亚洲精品狠狠操| 国产精品成人免费电影| 中文字幕亚洲欧美日韩在线不卡| 久久精品夜夜夜夜夜久久| 日韩成人av在线播放| 欧美在线免费观看| 九九热这里只有精品免费看| 国产成人一区三区| 91久久精品久久国产性色也91| 国产精品电影在线观看| 欧美一区二区三区精品电影| 免费不卡在线观看av| 精品视频久久久久久| 国产精品成av人在线视午夜片| 97精品在线观看| 亚洲午夜久久久久久久| 国产在线视频不卡| 欧美日韩精品二区| 日韩av中文在线| 欧美最猛黑人xxxx黑人猛叫黄| 精品久久久一区二区| 亚洲美女视频网| 国产欧美一区二区白浆黑人| 久久久免费观看| 精品一区二区亚洲| 成人黄色在线免费| 欧美日韩午夜视频在线观看| 国产福利视频一区| 国产日韩在线免费| 国产欧美欧洲在线观看| 欧美丝袜美女中出在线| 久久夜色撩人精品| 国产精品白丝av嫩草影院| 最近2019年好看中文字幕视频| 欧美不卡视频一区发布| 久久夜色精品亚洲噜噜国产mv| 久久久久久999| 在线观看国产精品日韩av| 久久综合久中文字幕青草| 亚洲男人av在线| 日韩av黄色在线观看| 深夜福利亚洲导航| 97视频在线播放| 91精品视频在线免费观看| 亚洲精品视频网上网址在线观看| 亚洲三级av在线| 国产最新精品视频| 777午夜精品福利在线观看| 中文字幕日韩电影| 久久久久亚洲精品国产| 欧美极品少妇xxxxⅹ喷水| 亚洲人永久免费| 午夜精品久久久久久久99热| 黄网站色欧美视频| 中日韩美女免费视频网址在线观看| 欧美激情精品久久久久久| 91在线网站视频| www.99久久热国产日韩欧美.com| 亚洲欧美一区二区激情| 亚洲高清福利视频| 久久天天躁狠狠躁夜夜av| 亚洲精品久久久久中文字幕欢迎你| 欧美在线播放视频| 色悠悠久久久久| 日韩av综合中文字幕| 久久亚洲精品中文字幕冲田杏梨| 久久久久久成人| 日韩av有码在线| 成人做爰www免费看视频网站| 精品国产一区二区三区久久狼5月| 操人视频在线观看欧美| 中文字幕欧美精品在线| 国产精品视频在线播放| 777午夜精品福利在线观看| 欧美成年人视频| 中文字幕在线看视频国产欧美| 国产精品日韩在线播放| 海角国产乱辈乱精品视频| 国产精品久久一| 午夜精品99久久免费| 日韩精品免费在线视频| 午夜精品一区二区三区在线播放| 亚洲视频在线观看视频| 69av成年福利视频| 91亚洲精品久久久| 中文字幕视频一区二区在线有码| 国产成人精品日本亚洲| 7m精品福利视频导航| 不卡av日日日| 国产性猛交xxxx免费看久久| 91欧美精品成人综合在线观看| 欧美电影免费在线观看| 久久免费视频这里只有精品| 欧美激情国内偷拍| 成人在线观看视频网站| 欧美日韩国产一中文字不卡| 国产一区二区三区高清在线观看| 欧美中文字幕在线播放| 九九精品视频在线| 亚洲精品小视频| 久久久久久免费精品| 欧美色视频日本高清在线观看| 久久久999成人| 精品无人国产偷自产在线| 中文字幕9999| 欧美性69xxxx肥| 午夜精品一区二区三区在线播放| 亚洲美女www午夜| 精品色蜜蜜精品视频在线观看| 亚洲黄色成人网| 午夜精品久久久久久久久久久久| 精品一区电影国产| 欧美一区二区影院| 欧美成aaa人片在线观看蜜臀| 欧美日韩国产一区中文午夜| 国产成人综合久久| 国产成人综合精品| 日韩欧美精品免费在线| 久久久久久久97| 精品呦交小u女在线| 正在播放欧美一区| 国产日韩在线看片| 欧美色播在线播放| 亚洲精品午夜精品| 亚洲女成人图区| 亚洲香蕉av在线一区二区三区| 国产精品aaaa| 69国产精品成人在线播放| www欧美日韩| 亚洲国产成人久久综合一区| 国产一区二区黄| 欧美精品国产精品日韩精品| 久久久久久香蕉网| 精品久久久久久久久中文字幕|