2016.03.14技术周报

感谢本期周报线索提供同学: 展歌,春建,兴民,桉远。

周报汇总 地址

周报博客 地址

Swift:

Swift 烧脑体操(四) - map 和 flatMap

the power of map and flatmap: map和flatMap的实际使用场景。

视频:

Brian Partridge - Result Driven Development: 录音不是特别清楚,但是内容很好。需要翻墙

开源代码:

Swift 开源项目精选 涵盖存储、网络、图片、框架、界面等开源代码

文章:

读 Threading Programming Guide 笔记(三)

读 Threading Programming Guide 笔记(四)

iOS单元测试

by 崔春健

一、什么是单元测试?

1、最小可测单元

2、不是为了发现bug,是为了提高开发效率,为了我们的代码健康可持续发展

二、单元测试的优缺点

1⃣️优点:

1、好的单元测试就是一份上好的文档,而且比文档更容易被程序员接受。

2、开发人员修改代码不再畏首畏尾,提高开发者的信心

3、单元测试能保证在加入新功能或修改旧功能时代码的正确性

4、单元测试保证在整个开发流程中代码都会被测试,更容易及早发现问题,降低风险。对于项目管理来说,使软件的开发流程更容易掌控。

2⃣️缺点:

1、单元测试不能减少研发的代码量,反而会花费很多精力在编写单元测试上,增加了开发成本,而且对开发人员的要求也会更高
另外个人觉得,单元测试对于很小的项目意义不大;对于项目周期较长,需求比较复杂的中性或大型项目,单测将意义重大

三、测试用例的来源

1、需求和详细设计文档

2、bug fix

四、单元测试由谁写

1、最好是开发者本人

2、对于新人,可以由老师傅来写单元测试,用于指导新人开发

五、如何写单元测试

1、iOS单元测试的结构是这样的,

2、每一个Test Case的写法有三个步骤:①Mock对象,准备测试数据。②调用要测试的目标API。③验证输出和行为是否正确

测试普通文件消息收发:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (void)testSendFileMessage {
// ①Mock对象,准备测试数据
BDIMFileMessage *fileMessage = [[BDIMFileMessage alloc] init];
BDIMFileMessageContent *fileContent = [[BDIMFileMessageContent alloc] init];
fileContent.fileName = @"bd_logo1.png";
fileContent.filePath = deskTopPath;
fileMessage.comnFile = fileContent;
fileMessage.addresserName = @"tester";
fileMessage.extra = @"file_extra";
// ②调用要测试的目标API
[self.conversation sendMessage:fileMessage];
// ③验证输出和行为是否正确
expect([_imMessage isKindOfClass:[BDIMFileMessage class]]).will.beTruthy();
}

3、Application Tests

.    $(BUILT_PRODUCTS_DIR)/<app_name>.app/<app_name>
.    $(BUNDLE_LOADER)

六、代码的可测性

  • 类之间要松耦合
  • 被测试的函数需要产生可测量的结果
  • 被测试的函数要遵循单一职责
  • 展示和业务逻辑要分开
  • 记得重构,不断提高代码的可测性

七、最佳实践

  • 每个功能类都应提供单元测试,且每一个测试类,只依赖于其要测试的受测类。使用伪造对象避免对其他类的依赖,保证一个测试类只关注一个被测类,当测试不通过时,就能迅速的定位到是谁发生了错误,而不会受到其他类的干扰;使用伪造环境避免其他环境的干扰,保证case在任何环境下都能输出同样的测试结果

  • 一个单测方法只测试一个功能点,并且不依赖其他测试用例的结果作为输入,保证case的原子性。if-else这种分支的情况最好分成两个case来测试

  • 单元测试通过数据的变化来做输出结果的验证

  • 应对所有暴露的属性和方法提供测试(包含回调方法),私有方法则不必。因为对外接口应该会调用到所有的私有方法,而且私有方法相对公有方法来说发生变动的可能性大很多,会造成不必要的修改测试代码的成本。如果非要测试私有方法,可以通过KVC、子类化和类别来实现

  • TDD,测试驱动开发的妙处即在于,它以需求为引领,通过测试的形式,来指导开发者进行软件的设计与架构,并编写出最为精炼的代码,使得测试用例运行通过。经过适当的重构之后,测试用例与产品代码可达到较为健康的状态。

  • 第三方的框架有很多,OCUnit、GHUnitExpectaOCMock,目前我使用的OCUnit + Expecta

八、衡量标准

1、代码覆盖率

2、Case的成功率

2016.03.06技术周报

感谢本期周报线索提供同学: 一晖,桉远

周报汇总 地址

周报博客 地址

视频:

iOS内存管理及优化

开源代码:

infer:A static analyzer for Java, C and Objective-C http://fbinfer.com/

facebook xcbuild: xcbuild is an Xcode-compatible build tool with the goal of providing faster builds, better documentation of the build process and running on multiple platforms (in particular OS X and Linux)

TSWeChat: A high copy WeChat, Written by Swift.

EarlGrey: EarlGrey is a native iOS UI automation test framework that enables you to write clear, concise tests. 一篇EarlGrey的介绍文章

Advance: A powerful animation framework for iOS.

文章:

Swift GYB 简易教程: Swift源码中很多GYB文件,本文简单介绍了如何使用GYB生成代码模板及如何使用GYB生成源码文件。我觉得对于查看Swift源码有帮助。

Apple Memory Usage Performance Guidelines: 是上面内存管理及优化视频中提到的苹果文档。

Cocoapods系列教程 : 从零开始到各种私有管理

2016.02.28技术周报

感谢本期周报线索提供同学: 高兴民,桉远

周报汇总 地址

周报博客 地址

开源代码:

FLAnimatedImage is a performant animated GIF engine for iOS:

  • Plays multiple GIFs simultaneously with a playback speed comparable to desktop browsers
  • Honors variable frame delays
  • Behaves gracefully under memory pressure
  • Eliminates delays or blocking during the first playback loop
  • Interprets the frame delays of fast GIFs the same way modern browsers do

Swift

Swift 烧脑体操(一) - Optional 的嵌套

Swift 烧脑体操(二) - 函数的参数

Swift 烧脑体操(三) - 高阶函数

文章:

深入浅出-iOS函数式编程的实现 && 响应式编程概念 本篇主要回顾一下--iOS函数式编程 && 响应式编程概念 ,如何一步步实现函数式编程的过程,对阅读Masonry && SnapKit源码有一定的帮助

Apple Pay 编程指南 Apple Pay介绍,配置和接入等

函数式相关的几篇文章:

What the heck is a monad

flatmap

map

2016.02.21技术周报

感谢本期周报线索提供同学: 张萌,桉远

周报汇总 地址

周报博客 地址

开源代码:

30 days of Swift: A self taught project to learn swift.

LazyTableImages: Populating UITableView content asynchronously: 苹果官方出了个demo,LazyTableImages,对列表里图片很多的情况有很好的优化作用。我看了一下,挺实用的。

文章:

Protocol-Oriented Programming in Swift

Swift 2.0: Understanding flatMap

静态类型的 NSUserDefaults

读 Threading Programming Guide 笔记

swift函数柯里化介绍及使用场景: 函数柯里化是函数式编程里的一个重要概念。swift中的柯里化可能很多人都没有了解过,今天给大家介绍一下柯里化的概念和一些使用场景。

如何处理 Swift 中的异步错误

2016.02.14技术周报

感谢本期周报线索提供同学: 桉远

周报汇总 地址

周报博客 地址

开源代码:

SwiftString: A comprehensive, lightweight string extension for Swift

文章:

如何防止客户端被破解:很多应用都需要用户登录或者签名认证,这可能需要在客户端保存登录信息、签名密钥、加密算法等。如何保证这些重要信息不被窃取,算法不被破解,这些成为应用开发中很重要的内容,同样也是最容易忽视的地方。一个小小的细节可能就成为整个系统的突破口,这里从实际工程角度总结了一些容易忽视的细节和常用的方法。

iOS自定义转场动画实战讲解

iOS内存管理和malloc源码解读

程序员的自我修养:

程序员到底是一个什么职业?

2016.02.07技术周报

感谢本期周报线索提供同学:兴民,桉远

周报汇总 地址

周报博客 地址

新春特辑,哈哈哈,祝大家新春快乐,🐵年大吉!

开源代码:

awesome swift: awesome swift 系列,汇聚各种好的swift资源,不收藏等啥呢!

Swift高仿“简书”

Yep: 整套纯Swift开发应用

Awesome Swift Playgrounds: 各种供你娱乐的playground

文章:

Reader Submissions – NSHipster: 由NSHipster读者提供的一些小技巧。

Live Photo API on iOS: What are Live Photos? From a marketing perspective, Live Photos record the moments just before and after you take a photo. Under the hood, a Live Photo is just a JPEG image together with a QuickTime file contaning an H.264 track.

iOS热修复(动态Framework) 介绍动态framework修复app

猿题库iOS客户端架构设计: 猿题库是一个拥有数千万用户的创业公司,从2013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代。在如此快速的开发过程中,如何保证代码的质量,降低后期维护的成本,以及为项目越来越快的版本迭代速度提供支持,成为了我们关注的重要问题。这篇文章将阐明我们在猿题库 iOS 客户端的架构设计。

Chris Lattner谈Swift 3和Cocoa“重命名”:近日,在“swift-evolution”邮件列表中,Swift创建者Chris Lattner在一篇博文中概述了Swift 3定义的一些指导原则,并明确表示该版本会带来破坏性修改。

2016.02.01技术周报

感谢本期周报线索提供同学: 兴民,桉远, Zealot

周报汇总 地址

周报博客 地址

开源代码:

2015开源iOS App总结 十几款开源的app

furni-ios: furni-ios 是由 Twitter 开发团队出品的一款用 Swift 写的 iOS 家居商城应用, 其主要目的在于让开发者从这款 Demo 应用中看出 Fabric 的强大

Localize-Swift: 一款开发者不可或缺的国际化及本地化字符串框架支持类库。同样地,使用简单、直观又方便。毫无疑问,这款非常值得收录。

文章:

使用UIKit进行面向协议的编程:揭开『面向协议编程』真正的面纱。尤其是针对日常 UI 的开发,大部分实例代码并没有切合实际的使用场景,也没有利用任何框架。

swift api transformation: Swift去掉API中的NS等一些更swift的变化。

Parse的底层多线程处理思路:GCD高级用法

UITableView性能优化

Square对iOS App架构的新尝试—Ziggurat

程序员的自我修养:

MARGARET HAMILTON: MARGARET HAMILTON,一个女程序员,她的代码把人送上了月球。有兴趣的朋友可以前往一读

2016.01.25技术周报

感谢本期周报线索提供同学: 高兴民,桉远。

最近大家都忙着晋升材料准备和项目中,忙累了,大家可以来看看本期的精彩内容。

周报汇总 地址

周报博客 地址

视频

The evolution of an iOS programmer: Chris Eidhof本人讲述自己在iOS开发过程中的成长与收获。其中还是有很多点比较具有通用性,比如,写代码的时候时刻想着是为以后接收你代码人而写等等。

开源代码:

Every.swift: A swift wrapper for NSTimer

文章:

iOS开发之深入理解GCD: 本文为raywenderlich 深入理解GCD的一篇译文,详细讲解了GCD相关的知识。

高效开发iOS系列 – 那些不为人知的KVC: 文章主要讲解了KVC中容易被开发者忽视却很有用的用法。

swift internals: This site hosts internal documentation for the Swift compiler and standard library, as well as the development version of the Swift API Guidelines.


27 iOS open source libraries to skyrocket your development.
: 27个常用的iOS开源库。

2016.01.18技术周报

感谢本期周报线索提供同学: 张萌,桉远。

周报汇总 地址

周报博客 地址

视频

Sharing Swift between iOS and OS X: iOS 和 OS X之间共享代码, 演讲人 @wilshipley founder of Omni Group

Fun with Swift: Chris Eidhof(objc.io创始人)

pomo.tv: A collection of videos about Mac, iOS and Swift. Chris Eidhof 创办

开源代码:

IBAnimatable: Design and prototype UI, interaction, navigation, transition and animation for App Store ready Apps in Interface Builder with IBAnimatable.

文章:

How to C in 2016

不再安全的 OSSpinLock: OSSPinLock作为锁已经不再安全了,文章还对比了各种锁的性能对比。

Swift’s mysterious Builtin module: 揭秘Swift内置模块

Creating your first iOS Framework: 手把手教你创建自己的framework

charles中如何对https抓包: 使用Charles抓https请求数据包

iOS多线程编程系列:
四篇objc.io 的文章,经常会拿出来读读,每次都有新的体会。

concurrency apis and pitfalls

Common background practices

Low level concurrency apis

Thread safe class design