来源:伯乐在线 - 酷酷的哀殿

链接:http://ios.jobbole.com/89483/

点击 → 申请加入伯乐在线专栏作者

从 SDWebImage 谈如何为开源软件做贡献

相识 – 知我者谓我心忧,不知我者谓我何求

今天和别人聊天时,扯到了这个非常著名的开源库。算算日子,我和 SDWebImage 已经认识 3 年零 11 个月了。将近四年的时间,说短不短,说长不长。

作为 iOS 开发者,我接触的第一个库就是 SDWebImage(第二个是 ASIHttpRequest),研究时间最长的也是 SDWebImage。

刚学完基础知识,开始做项目时,我就用到了这个图片缓存库。下面的代码是我从 SDWebImage 身上学到的第一个知识,也是最重要的一个知识:如何设计一个接受多个可选参数的方法,并让调用方能够简单地使用。

对于初出茅庐的我来说,这份代码带给我的除了上面的知识以外,我还学会了如何给现有的类写 扩展,第一次见识了 block 的 威力 ……

@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。点此创建

    https://github.com/rs/%60SDWebImage%60/issues/new

后记

SDWebImage 4.0 版本已经在路上,该版本提供了更加细粒度的控制加载请求,兼容 Swift 3,使用了最新的 OC 语法……

从 SDWebImage 谈如何为开源软件做贡献的更多相关文章

  1. 使用eclipse开发工具与hibernate开发者为开源一起做贡献

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50525363 hibernate使用的是gradle自动构建工具, ...

  2. NASA的CTO——开源软件使我们诚实

    Chris C.Kemp,谷歌设置新职位CTO让他领导 原文: NASA's CTO: Open source software keeps us honest 作者: Shawn Freeman 译 ...

  3. OpenSSF的开源软件风险评估工具:Scorecards

    对于IT从业者来说,Marc Andreessen 十年前提出"软件吞噬世界"的观点早已耳熟能详.无论是私人生活还是公共领域,软件为现代社会的方方面面提供动力,对现代经济和国家安全 ...

  4. 使用开源软件 enfuse 做照片的曝光合成

    使用开源软件 enfuse 做照片的曝光合成 所谓曝光合成就是对同一场景用不同的曝光量拍摄多张照片,然后将这些照片再合成为一张照片.之所以我们要这么做是因为现在的相机感光的动态范围相比人眼实在是太小了 ...

  5. 为什么要做一款ERP软件——开源软件诞生7

    技术之外的探讨--第7篇 用日志记录“开源软件”的诞生 赤龙ERP开源地址: 点亮星标,感谢支持,与开发者交流 kzca2000 码云:https://gitee.com/redragon/redra ...

  6. Python 浅谈编程规范和软件开发目录规范的重要性

    最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...

  7. python浅谈编程规范和软件开发目录规范的重要性

    前言 我们这些初学者,目前要做的就是遵守代码规范,这是最基本的,而且每个团队的规范可能还不一样,以后工作了,尽可能和团队保持一致,目前初学者就按照官方的要求即可 新人进入一个企业,不会接触到核心的架构 ...

  8. spring boot 实战:我们的第一款开源软件

    在信息爆炸时代,如何避免持续性信息过剩,使自己变得专注而不是被纷繁的信息所累?每天会看到各种各样的新闻,各种新潮的技术层出不穷,如何筛选出自己所关心的? 各位看官会想,我们是来看开源软件的,你给我扯什 ...

  9. 2014 年最热门的国人开发开源软件 TOP 100 - 开源中国社区

    不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是 ...

随机推荐

  1. 使用DNSPod来处理网站的均衡负载(转)

    add by zhj:配置倒是蛮简单的,其实就是把域名与多个IP进行关联,在数据库中实现这个应该也是蛮简单的. 原文:http://kb.cnblogs.com/page/75571/ 首先介绍下DN ...

  2. UVALive 7077 - Song Jiang's rank list(模拟)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  3. RAID对硬盘的要求及其相关

    Raid 0:至少需要两块硬盘,磁盘越多,读写速度越快,没有冗余. Raid 1:只能用两块硬盘,两块硬盘的数据互为镜像(写慢,读快),一块磁盘冗余. Raid 5:至少需要3块硬盘,一块磁盘冗余. ...

  4. Python输入输出(IO)

    程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的 ...

  5. Python序列(Sequence)

    Sequence是Python的一种内置类型(built-in type),内置类型就是构建在Python Interpreter里面的类型,三种基本的Sequence Type是list(表),tu ...

  6. login placeholder

    $(function(){ function isPlaceholder(){ var input = document.createElement('input'); return 'placeho ...

  7. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  8. C#之数组

    什么是数组?数组是一种数据结构,包含同一个类型的多个元素.数组的声明:int[] myIntArray; 注:声明数组时,方括号 ([]) 必须跟在类型后面,而不是变量名后面.在 C# 中,将方括号放 ...

  9. Windows操作系统单文件夹下到底能存放多少文件及单文件的最大容量

    本文是转自:http://hi.baidu.com/aqgjoypubihoqxr/item/c896921f8c2eaba5feded5f2         最近需要了解Windows中单个文件夹下 ...

  10. 【绝密外泄】风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1

    [绝密外泄]风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1 由于是[绝密外泄]资料,防止被查,需要的小伙伴赶紧下载附件中的课件文档.由于视频太大了,已放在百度网盘了,已经在附中说 ...