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

链接: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 语法……

最新文章

  1. ASP.NET本质论第二章应用程序对象学习笔记1
  2. 【BZOJ】【2733】【HNOI2012】永无乡
  3. 跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量
  4. React组件一
  5. jvm的client和server
  6. python编程快速上手之第5章实践项目参考答案
  7. python 字符串 string
  8. java加密算法AES与RSA
  9. 【POJ 1459 power network】
  10. Linux OS7 常用
  11. nginx.exe启动错误:bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
  12. C++程序设计方法4:成员函数模板
  13. MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错,MySQL报General error: 1243错误
  14. flask 使用Flask-SQLAlchemy管理数据库(连接数据库服务器、定义数据库模型、创建库和表)
  15. linux环境下的c++编程
  16. nginx指令中的优化(配置文件)
  17. JavaScript无阻塞加载具体方式
  18. centos6.5搭建redmine3.4
  19. Linux救援模式
  20. LG3389 【模板】高斯消元法

热门文章

  1. Android将ScrollView移动到最底部
  2. linux极点五笔无法输入词组_ibus设置
  3. MyEclipse中无法将SVN检出来的项目部署到tomcat中
  4. 51Nod 1405 树的距离之和 (树dp)
  5. 观察者模式:关于通知的使用(NSNotificationCenter)
  6. junit学习(3.x)
  7. 利用HTML5开发Android(3)---Android中的调试
  8. aspnetpager的2种分页方法
  9. 有关获取session属性时报nullPointException(空指针异常)的解决方案
  10. git免登录-ssh-key