这是原文:

现在很多公司都崇尚RAC开发了,尤其是配合MVVM的架构,使整个项目的逻辑性更加的强,而且维护代码和迭代功能也不是那么头疼了。本人觉得很重要,所以,从今天开始,分享一下RAC的学习方法,一步一步的教大家接受并开始尝试这种机制。这是第一天学习笔记,以理论为主,希望大家能静下心沉淀学习一下,为以后的学习做铺垫。

2.1新建一个Aggregate target

Xcode中一个集合目标可以一次构建多个目标,包括命令行脚本。在Xcode菜单中选择File/New/Target,选择iOS/Other并点击Aggregate,如图:

澳门微尼斯人手机版 1Aggregate

取个target名称

澳门微尼斯人手机版 2target
name

什么是RAC?

全拼是ReactiveCocoa,是由Github开源的一个应用于iOS和OS开发的新框架,简单的说,就是一个第三方库,可以大大简化你的代码过程。RAC具有函数式编程和响应式编程的特性,并且目前看来安全可靠。

详细介绍:

今天更新xcode8 后发现 xcodebuild
无法编译通过.后面介绍的方法需要调整一下. 即由xcode
来完成编译,再由Aggregate 合并.

RAC的作用?

  • 响应式编程的特性,代码思路更加清晰,数据处理更加清晰
  • 简化代码,降低各个模块的耦合度
  • 需要用到通知的地方用起来很方便,而且和项目框架配合很灵活

但由于涉及到的知识范围很广, 不仅需要iOS开发技术,
还需要运维知识和各个命令工具的使用方法。 而且国内外的资料少的相当可怜,
没有最佳实践, 没有专门的第三方平台, 造成很多东西都是一步步试错出来的,
一步一坎, 所以用了很长时间。

但每次编译后这样把不同路径库拷贝,再发布是一个很麻烦的过程,有人会想到用脚本简化,

RAC中用到的常见类

  • RACSiganl
    信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。通俗地说,就是需要去处理什么事情,就发个信号,告诉对方,可以处理啦。

默认一个信号是冷信号,默认不会被触发,只有订阅了这个信号,这个信号才会成为热信号,值改变的时候,才会被触发。

至于如何订阅信号和创建信号,今天先不说,下篇文章会系统的讲下应用和具体流程。

  • RACSubscriber 订阅者 ,用于发送信号
    ,这是一个协议,只有遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。

  • RACDisposable
    用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。也可以主动取消订阅信号。

  • RACSubjec
    信号提供者,通俗地说,本身就是信号源,也是发送信号的人。一般传递数据,或者要去处理事情,直接调用他就好了。

  • RACCommand
    RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。我一般是用做数据请求的类,把数据请求放到这里。

  • RACMulticastConnection用于当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类处理。通俗地说,就是为了避免重复调用,多次请求。

  • RACScheduler
    RAC中的队列,用GCD封装的,没有深入使用过,后期我会补上这个类的应用场景。

今天给大家讲解的都是理论知识,一定要静下心来记录一下,不懂没有关系,很快我会根据例子讲解下他们的具体应用,相信大家就会有更感官的理解了。学习知识要循序渐进,知其然知其所以然,希望我的小小文字,能帮助你点滴。谢谢支持。

安装方式: $brew install gcovr

编译时,需要注意,在 valid Architecures 加入全部需要的 arch

澳门微尼斯人手机版 3

更多Jenkins的知识具体看这两篇教程。

这样分别用在模拟器和真机状态编译一次,分别生成Release-iphoneos
和Release-iphonesimulator然后在调用Aggregate target 合成一个完整的 lib

Jenkins工具

这是翻译稿:

5.2.1 SVN

澳门微尼斯人手机版 4

关于credential:

Jenkins检测到当前服务器访问不了代码仓库时, 会提示你设置权限,
进入Credential, 设置账号密码就可以了。

2.3 设定需要输出的头文件

在原来的库的Build Phases 中Copy
Files中设定要导出的头文件,注意这里subpath
的缺省值是include/${PROJECT_NAME}
这里直接改成include,否则脚本拷贝位置不对.

澳门微尼斯人手机版 5Paste_Image.png

用Sonar能够实现什么?

2.4 编译库

首先把原项目静态库用真机版本编译一次,用来触发拷贝头文件的动作

在target选中的任意选一个设备来触发编译脚本

澳门微尼斯人手机版 6

打开静态库的产品目录,把Debug-universal 目录整个拷给使用者即可,非常方便

澳门微尼斯人手机版 7Paste_Image.png

问题1: “规则”指的是什么?

2.2 增加编译后脚本:

切换Aggregate到Build Phases标签;在这里设置构建目标时将要执行的动作。

点击Add Build Phase按钮,在弹出的菜单中选择New Run Script Phase,如下图:

澳门微尼斯人手机版 8New
Run Script Phase

展开Run Script模块,在Shell行下粘贴如下代码:

澳门微尼斯人手机版 9Shell

脚本内容如下,注意这里要把 LIB_TARGET_NAME设为你真正的名字

# define output folder environment variableLIB_TARGET_NAME=${PROJECT_NAME}UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universalOUTPUT_DIR=${UNIVERSAL_OUTPUTFOLDER} # Step 1. Build Device and Simulator versionsxcodebuild -target ${LIB_TARGET_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"xcodebuild -target ${LIB_TARGET_NAME} -arch x86_64 -sdk iphonesimulator -configuration ${CONFIGURATION} BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" # make sure the output directory existsmkdir -p ${UNIVERSAL_OUTPUTFOLDER} # Step 2. Create universal binary file using lipolipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"# Last touch. copy the header files. Just for conveniencemkdir -p ${OUTPUT_DIR}cp -v -f -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${OUTPUT_DIR}"

澳门微尼斯人手机版,代码并不十分复杂,它是这样工作的:**UNIVERSAL_OUTPUTFOLDER
**包括了通用二进制包将要被存放的文件夹:“Debug-universal”

**Step 1.
**第2行执行了xcodebuild并命令它构建ARM架构的二进制文件。(你可以看到这行中的-sdk
iphoneos参数)下一行再次执行了xcodebuild命令并在另一个文件夹中构建了一个针对Inter架构的iPhone模拟器的二进制文件,在这里关键参数是-sdk
iphonesimulator -arch i386。(如果感兴趣,你可以在man
page了解更多关于xcodebuild的资料)

Step 2. 现在已经有了2个.a文件分别对应两个架构。执行lipo
-create,用它们创建出一个通用二进制。

最后一行的作用是复制头文件到桌面的指定目录。

$ brew tap oclint/formulae

澳门微尼斯人手机版 10xcode
编译选项

其实Sonar的展示是将一系列的报告文件转换得到的,
文件又是通过各个工具生成的, 所以需要先安装工具。

# define output folder environment variableLIB_TARGET_NAME=${PROJECT_NAME}UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universalOUTPUT_DIR=${UNIVERSAL_OUTPUTFOLDER} # make sure the output directory existsmkdir -p ${UNIVERSAL_OUTPUTFOLDER} # Step 2. Create universal binary file using lipolipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"# Last touch. copy the header files. Just for conveniencemkdir -p ${OUTPUT_DIR}cp -v -f -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${OUTPUT_DIR}"

Linux命令

这里提到使用Aggregate来调用lipo合并方法,方法如下:

覆盖率

Build Active Acrchitercture Only 要为
No,这样才会把新手机不支持的指令,armv7s i386 才能被加进去.

不过最后都将每个工具, 每个步骤打通, 将各个工具连接起来, 整理成.sh脚本 和
.properties配置文件, 这样在后续新添项目时会很轻松。

lipo -create libBLEsim.a libBLEarm.a -output libBLE.a

“gem管理器”, 通过该工具可以安装别的gem工具, 类似cocoapods。

Xcode 静态库项目,每次运行只会创建一个体系结构.比如真机版的.a
不能在模拟器下链接运行.这样会给使用者带来很大麻烦,使用项目无法用模拟器版本了.
一般做法是生成x86和ARM版本的.a,然后用lipo这个命令行格式合并两个库成一个.命令格式如下:

澳门微尼斯人手机版 11

arm64 armv7 armv7s x86_64 i386

OCLint是一个静态分析工具, 可以检测OC代码,
发现语法漏洞。用该工具来生成代码质量报告。

涉及到的工具包括(1.xctool 2.oclint, 3.gcovr, 4.sonar-runner),
虽然涉及的工具比较多, 每个用法都可详细的单独讲,
但不建议在开始时就深入了解这些, 本文会将用到的地方进行讲解,
后续深入了解请看给出的推荐资料。

安装方法:$brew install xctool

发表评论

电子邮件地址不会被公开。 必填项已用*标注