欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年09月02日 08:23:30   作者:波兒菜  
這篇文章主要給大家介紹了關(guān)于iOS組件依賴避免沖突的小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

問(wèn)題緣由

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

YBImageBrowser 依賴了 SDWebImage,在使用 CocoaPods 集成到項(xiàng)目中時(shí),可能會(huì)出現(xiàn)一些依賴沖突的問(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)似這樣依賴的:

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 都視為依賴沖突。

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

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

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

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

解決方案

使用 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)更多的版本(規(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è)限制都是“完美”覆蓋所有版本的。

避免依賴沖突的暴力方案

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

• 直接修改其它組件依賴的 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 的依賴版本。

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

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

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

要做到的目標(biāo)是,既滿足部分用戶快速集成組件,又能讓部分用戶解決依賴沖突的前提下保證能享受組件將來(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'
end
s.subspec "NOSD" do |core|
core.source_files = "YBImageBrowser/**/*.{h,m}"
core.exclude_files = "YBImageBrowser/WebImageMediator/YBIBDefaultWebImageMediator.{h,m}"
end

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

// 依賴 SDWebImage
pod 'YBImageBrowser' 
// 不依賴 SDWebImage
pod 'YBImageBrowser/NOSD'

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

第一步是設(shè)計(jì)一個(gè)抽象接口(這個(gè)接口不依賴 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)依賴了 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 中也可以看到,在不依賴 SDWebImage 的集成方式時(shí)排除了兩個(gè)文件:YBIBDefaultWebImageMediator.{h.m}。

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

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

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

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

參考

[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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 基于iOS pod最新的安裝和使用方法(分享)

    基于iOS pod最新的安裝和使用方法(分享)

    下面小編就為大家分享一篇基于iOS pod最新的安裝和使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 詳解iOS - ASIHTTPRequest 網(wǎng)絡(luò)請(qǐng)求

    詳解iOS - ASIHTTPRequest 網(wǎng)絡(luò)請(qǐng)求

    本篇文章主要介紹了iOS - ASIHTTPRequest 網(wǎng)絡(luò)請(qǐng)求 ,詳細(xì)的介紹了 ASIHTTPRequest的使用,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • Objective-C中NSNumber與NSDictionary的用法簡(jiǎn)介

    Objective-C中NSNumber與NSDictionary的用法簡(jiǎn)介

    這篇文章主要介紹了Objective-C中NSNumber與NSDictionary的用法簡(jiǎn)介,雖然Objective-C即將不再是iOS的主流開(kāi)發(fā)語(yǔ)言...well,需要的朋友可以參考下
    2015-09-09
  • iOS Swift利用UICollectionView實(shí)現(xiàn)無(wú)限輪播功能(原理)詳解

    iOS Swift利用UICollectionView實(shí)現(xiàn)無(wú)限輪播功能(原理)詳解

    無(wú)線輪播圖的實(shí)現(xiàn)方式有很多,下面這篇文章主要給大家介紹了關(guān)于iOS Swift利用UICollectionView實(shí)現(xiàn)無(wú)限輪播功能(原理)的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • iOS App開(kāi)發(fā)中的UIStackView堆疊視圖使用教程

    iOS App開(kāi)發(fā)中的UIStackView堆疊視圖使用教程

    UIStackView是iOS9以來(lái)新增加的組件,使我們能夠?qū)IView子類(lèi)對(duì)象進(jìn)行靈活排版,這里我們就來(lái)看一下iOS App開(kāi)發(fā)中的UIStackView堆疊視圖使用教程
    2016-07-07
  • IOS實(shí)現(xiàn)展開(kāi)二級(jí)列表效果

    IOS實(shí)現(xiàn)展開(kāi)二級(jí)列表效果

    本文通過(guò)實(shí)例代碼向大家演示在IOS中如何實(shí)現(xiàn)展開(kāi)二級(jí)列表的效果,這個(gè)功能效果很好,對(duì)于日常開(kāi)發(fā)APP中很有幫助,下面一起來(lái)看看如何實(shí)現(xiàn)吧。
    2016-08-08
  • iOS指紋登錄(TouchID)集成方案詳解

    iOS指紋登錄(TouchID)集成方案詳解

    這篇文章主要為大家詳細(xì)介紹了iOS指紋登錄TouchID的集成方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • IOS開(kāi)發(fā)自定義Button的外觀和交互行為示例詳解

    IOS開(kāi)發(fā)自定義Button的外觀和交互行為示例詳解

    這篇文章主要為大家介紹了IOS開(kāi)發(fā)自定義Button的外觀和交互行為示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • iOS中最全的各種定時(shí)器使用教程

    iOS中最全的各種定時(shí)器使用教程

    這篇文章主要給大家介紹了關(guān)于iOS中最全的各種定時(shí)器的使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),通過(guò)文中介紹的最全的定時(shí)器相信會(huì)對(duì)各位iOS開(kāi)發(fā)者們帶來(lái)一定的幫助,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • iOS App開(kāi)發(fā)中修改UILabel默認(rèn)字體的方法

    iOS App開(kāi)發(fā)中修改UILabel默認(rèn)字體的方法

    UILabel是控制字體顯示的主要方式,這里我們就來(lái)看看通過(guò)NSAttributedText和NSMutableAttributedText這兩個(gè)類(lèi)或者用runtime的方式來(lái)在iOS App開(kāi)發(fā)中修改UILabel默認(rèn)字體的方法
    2016-07-07

最新評(píng)論