前言

先来了解下开发过程中常常接触的几个编程思想

  1. 面向过程:处理事情以过程为核心,一步一步的实现。
  2. 函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。

函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)

代表:ReactiveCocoa

  1. 面向对象:万物皆对象

面向对象对比面向过程的优胜之处在于,名词化的概念比动词化的描述,更便于人类理解。 这也是相比函数式编程的主要优点,许多函数是难以命名的,但对象却很容易。 回顾下封装、继承、多态。

封装是为了更好的重用性、可扩展性,但要综合考虑性能问题,即使新增了判断也会增加性能,只是不会量级的增加。 比如简单工厂和抽象工厂(反射机制)的封装,会增加性能的消耗。但把对象的管理变成了可配置化。

  1. 链式编程思想:将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好a(1).b(2).c(3)。

链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值) 代表:masonry框架

//执行方法的同时之后,立即执行方法返回的block

  1. 响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

代表: a. KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现,也是 Cocoa Binding 的基础。当被观察对象的某个属性发生更改时,观察者对象会获得通知。 b. Reactive Cocoa框架

I 、链式编程的例子


1.1 实现链式编程的两种形式

  1. 声明属性,属性的类型是block,block必须有返回值(本身对象),block参数(需要操作的值)
  2. ​声明方法: 缺点就是 Xcode提示不太友好。不推荐​

本质都是一样的,就是执行(getter)方法之后,得到一个block,block必须有返回值(本身对象),block参数(需要操作的值)

1.2 通过声明方法形式实现链式编程

缺点就是 Xcode提示不太友好。不推荐`

block 实现链式编程的例子1:(将block和method的特性 结合起来) github.com/zhangkn/DKU…

直接声明方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

例子: ​​p.run() <=> [p run]()​​​ 效果:​​​ p.run() <=> [p run]();// 执行方法的同时之后,立即执行方法返回的block。​

int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
//使用block实现链式编程
People *p= [[People alloc]init];
// p.run() <=> [p run]();// 执行方法的同时之后,立即执行方法返回的block。
p.run().study();

p.run().name(@"将block和method的特性 结合起来");


}
return 0;
}

代码的实现

#import "People.h"

@implementation People

- (People *(^)())run{
return ^{
NSLog(@"run");
return self;
};// 返回一个block
}


- (People *(^)())study{
return ^{
NSLog(@"study");
return self;
};// 返回一个block
}


- (People *(^)(NSString *))name{
return ^(NSString *name){
NSLog(@"%@",name);
return self;
};
}

1.3 通过声明属性形式实现链式编程

声明属性,属性的类型是block,block必须有返回值(本身对象),block参数(需要操作的值)

声明属性: 本质就是利用他的getter方法

完整SDK源码【封装富文本API,采用block实现链式编程】(block 的妙用:结合block和方法的优点实现iOS的链式编程)

部分API

链式编程在iOS开发中的应用_iOS

  1. 用法例子

链式编程在iOS开发中的应用_iOS_02

链式编程在iOS开发中的应用_函数式编程_03


NSMutableAttributedString *xx  = [[NSMutableAttributedString alloc]init];


xx.kn_addString(@"封装富文本API").kn_fontColor(UIColor.redColor).kn_addString(@"采用block实现链式编程").kn_fontColor(UIColor.blueColor).kn_addString(@"!");

github.com/zhangkn/Cha…

以Masonry 框架为例子,进行分析

调用的equalTo:方法 返回的就是一个返回值为MASConstraint的block

- (MASConstraint * (^)(id))equalTo { return ^id(id attribute) { return self.equalToWithRelation(attribute, NSLayoutRelationEqual); }; }

用法

- (UIImageView *)imgForReason{

if (nil == _imgForReason) {



UIImageView *img2 = [[UIImageView alloc] init];

_imgForReason = img2;

[self addSubview:_imgForReason];

[img2 mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(self.mas_left).offset(25);

make.top.equalTo(self.imgForPassword.mas_bottom).offset(12);

make.size.mas_equalTo(CGSizeMake(kScreenWidth-100, 76));



}];



}

return

see also

iOS富文本&图文混排的使用指南

1、封装富文本API,采用block实现链式编程

2、 超链接属性

3、HTML字符串与富文本互转

4、创建带有图片的富文本