從 SDWebImage
談如何為開源軟體做貢獻
相識 – 知我者謂我心憂,不知我者謂我何求
今天和別人聊天時,扯到了這個非常著名的開源庫。算算日子,我和 SDWebImage
已經認識
3 年零 11 個月了。將近四年的時間,說短不短,說長不長。
作為 iOS 開發者,我接觸的第一個庫就是 SDWebImage
(第二個是 ASIHttpRequest
),研究時間最長的也是 SDWebImage
。
剛學完基礎知識,開始做專案時,我就用到了這個圖片快取庫。下面的程式碼是我從 SDWebImage
身上學到的第一個知識,也是最重要的一個知識:如何設計一個接受多個可選引數的方法,並讓呼叫方能夠簡單地使用。
對於初出茅廬的我來說,這份程式碼帶給我的除了上面的知識以外,我還學會了如何給現有的類寫 擴充套件,第一次見識了
block
的 威力 ……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
@implementation UIImageView (WebCache) - (void)setImageWithURL:(NSURL *)url { [self setImageWithURL:url placeholderImage:nil]; } - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { [self setImageWithURL:url placeholderImage:placeholder options:0]; } - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(`SDWebImage`Options)options { `SDWebImage`Manager *manager = [`SDWebImage`Manager sharedManager]; // Remove in progress downloader from queue [manager cancelForDelegate:self]; self.image = placeholder; if (url) { [manager downloadWithURL:url delegate:self options:options]; } } #if NS_BLOCKS_AVAILABLE - (void)setImageWithURL:(NSURL *)url success:(`SDWebImage`SuccessBlock)success failure:(`SDWebImage`FailureBlock)failure; { [self setImageWithURL:url placeholderImage:nil success:success failure:failure]; } - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder success:(`SDWebImage`SuccessBlock)success failure:(`SDWebImage`FailureBlock)failure; { [self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; } - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(`SDWebImage`Options)options success:(`SDWebImage`SuccessBlock)success failure:(`SDWebImage`FailureBlock)failure; { `SDWebImage`Manager *manager = [`SDWebImage`Manager sharedManager]; // Remove in progress downloader from queue [manager cancelForDelegate:self]; self.image = placeholder; if (url) { [manager downloadWithURL:url delegate:self options:options success:success failure:failure]; } } #endif |
實際上,通過這個專案,你還可以學到更多,比如,如何通過 NSData 判斷圖片的型別,如何管理多執行緒佇列……
相知 – 悲莫悲兮生別離,樂莫樂兮新相知
不知何時起,我註冊了 github 賬號,關注(watch)了這個開源專案。
對特定專案進行 watch 操作後,該專案任何新的 conversation(合併提交,建立新的 issue,有人回覆 issue)都會產生一個未讀通知。
隨著我對它的瞭解也越來越深,我發現了一系列令人震驚的事實:
- 這個庫僅僅是由兩位開發者維護者更新
- 歷史最悠久的未關閉 issue 出自 2011 年
- 幾乎所有的版本都有大小不一的 bug(crash、獲取錯誤的圖片、回撥無法執行……)
這些事實一次次地令我感覺震撼,作為一個擁有 15824 個 star 的開源庫,它是如此的脆弱
。於是,我成為了一名志願者,我努力地幫助開發者團隊解決 issue。
相殺 – 消滅bug,是所有程式設計師的夢想
Bug 是所有程式設計師的噩夢,而上面的 bug,有很多是在特定情況下才會發生的,是無法僅僅依靠開發團隊來避免的。作為該專案的成果享有者,我們是否可以做出一些自己的貢獻呢?
大部分的開發者可能會覺得自己無法貢獻程式碼。那麼,我們是否可以充當該專案的測試人員呢?
我在下面簡單的列出了一些普通開發者能做些什麼(主要以 SDWebImage
+ CocoaPods 為例)。希望各位讀者能夠一起為開源軟體做貢獻。
SDWebImage
的當前版本號為3.8.2
- 在專案的短期開發分支使用
pod '
SDWebImage', '~> 3.8.2'
,並定期執行pod update
。
可以快速收到 bug 修復版本,可以幫助驗證是否已經解決 bug。 - 在專案的長期開發分支使用
pod '
SDWebImage', '~> 3.8'
,並定期執行pod update
。
可以快速收到小的功能更新版本,可能需要修改專案程式碼,有較小的概率有 bug。 - 在新的專案中使用
pod '
SDWebImage', '~> 3'
,並定期執行pod update
。
有重大版本更新時,有很大概率需要修改專案程式碼,有較大的概率有 bug。 - 定期根據版本更新修改
Podfile
- 發現相關bug 後,請及時建立 issue。點此建立
後記
SDWebImage
4.0 版本已經在路上,該版本提供了更加細粒度的控制載入請求,相容 Swift 3,使用了最新的 OC 語法……
樂觀估計,我們年底前能用到該版本。
寫作本文時,
SDWebImage
收到了 15824 個 star。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式