iOS晋级知识汇总(七)第三方库

第三方库

AFNetworking

iOS客户端的第三方网络框架,代码地址

架构图

AFNetworking的架构图.png

AFURLSessionManager

  • 创建和管理NSURLSession、NSURLSessionTask
  • 实现NSURLSessionDelegate等协议的代理方法
  • 引入AFSecurityPolicy保证请求安全
  • 引入AFNetworkReachabilityManager监控网络状态

类的关系

AFN类的关系.png

SDWebImageView

架构图

SDWebImage的架构图.png

缓存流程

SDWebImageView的缓存流程.png

Reactive Cocoa

函数响应式编程框架,源代码地址

函数式编程它的核心思想是,它是一种将程序看成是数学方法的求值、不会改变状态、不会产生副作用(后面我们马上会谈到)的编程方式

响应式编程

RAC库是否了解

  • RAC是一个函数式响应编程
    • 信号和订阅

信号

  • 核心类RACSignal 继承于RACStream

    • 使用了抽象工厂、类簇设计模式,返回的对象都是抽象对象,实际上是通过不同的方法创建的具体对象也不同
    RAC信号类.png

如何理解信号

核心思想是RACSignal继承RACStream,RACStream的提供了方法:empty、return、bind、concat、zipWith这些都是抽象的函数,RACStream分类中有一些方法:map、take、skip、ignore、filter。。这些函数是对上述提供的抽象函数的不同组合逻辑。

什么是信号
信号代表一连串的状态,在状态改变时,对应的订阅者RACSubscriber就会收到通知,执行响应的指令。

什么是信号.png
  • RACReturnSignal 比如说[RACSignal return:@3]这个调用的就是RACReturnSignal的return
    • 覆盖RACStream中的return方法
    • 对传递进来的对象进行包装把它返回给调用方,把OC对象封装成一个信号返回给调用方
    • return返回的实例就是信号

订阅

RACSubscriber订阅者,订阅的流程:

RAC如何使用订阅.png

把传进来的Block参数,作为这个信号的成员变量保存下来,比如[nal subscribeNext:^(id _Nullable x) {}]

产生了RACSubscriber的类时候,在内部持有一个成员变量,内部的变量是didSubscribe的这个block,当调用RACSignal 的方法的时候,实际上就是执行内部保存的block;

RAC订阅的原理.png

例子分析:

RACSignal *nal = [RACSignal return:@3];
[nal subscribeNext:^(id  _Nullable x) {}];

RACSignal *nal = [RACSignal return:@3]分析

  • 首先分析[RACSignal return:@3]的方法,我们打开源码可以看到,是调用了RACReturnSignal的return方法。
+ (RACSignal *)return:(id)value {
    return [RACReturnSignal return:value];
}
  • 而RACReturnSignal的return方法主要工作是创建一个RACReturnSignal的对象,并将值赋值给这个对象。
RACReturnSignal *signal = [[self alloc] init];
signal->_value = value;
return signal;

[nal subscribeNext:^(id _Nullable x) {}]的分析

  • 1、当RACSignal的实例对象调用了subscribeNext的方法,该方法通过调用RACSubscriber的类方法subscriberWithNext得到RACSubscriber对象

  • 2、subscriberWithNext的方法内部是将nextBlockblock保存到RACSubscriber对象当中

  • 3、通过调用RACSubscriber的类方法subscriberWithNext得到RACSubscriber对象后,调用了RACSubscriber实例对象的subscribe方法

  • 4、subscribe方法是RACReturnSignal中的subscribe方法,因为上面的return方法返回的是RACReturnSignal对象。

  • 5、subscribe中的方法实现

    - (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
    NSCParameterAssert(subscriber != nil);
    //RACScheduler.subscriptionScheduler是一个单例,而schedule方法只是为了调用这个block
    return [RACScheduler.subscriptionScheduler schedule:^{
        [subscriber sendNext:self.value]; 
        [subscriber sendCompleted];
    }];
    }
    @implementation RACSubscriptionScheduler
        - (RACDisposable *)schedule:(void (^)(void))block {
        NSCParameterAssert(block != NULL);
    
        if (RACScheduler.currentScheduler == nil) return [self.backgroundScheduler schedule:block];
    
        block();//只是做了一个调用block
        return nil;
        }
    @end
    
    
  • 6、当schedule的block方法调用的时候,调用了RACSubscriber实例对象的- (void)sendNext:(id)value方法。

  • 7、最终在sendNext方法中调用了RACSubscriber实例对象中的nextBlock的block

    - (void)sendNext:(id)value {
    @synchronized (self) {
        void (^nextBlock)(id) = [self.next copy];
        if (nextBlock == nil) return;
    
        nextBlock(value);
    }
    }
    
  • 8、上述代码void (^nextBlock)(id) = [self.next copy];这个block恰好就是通过调用RACSubscriber的类方法subscriberWithNext得到RACSubscriber实例对象时,保存到RACSubscriber实例对象的block

  • 9、最终的结果就是 [nal subscribeNext:^(id _Nullable x) {}]中的x就是RACSignal *nal = [RACSignal return:@3]中的3

AsyncDisPlayKit

提升iOS界面渲染性的一个框架,代码地址

减轻主线程压力,把事情能放入到子线程的就放入到子线程,主要分为三个方面:

  • layout 文本宽高计算、视图布局计算
  • Rendering 文本渲染、图片解码、图形绘制
  • UIKit Objects 对象创建、对象调整、对象销毁

ASDK实现原理

UIView作为CALyaer的一个delegate,CALyaer作为UIView的一个成员变量负责UIView的展示工作,ASDK在此之上封装了一个NSNode类,而这个类当中会有一个.view或者一个成员变量,可以生成一个view,同时每一个uiview都有一个.node的一个属性可以获取到它所对应的节点。

UIView、CALayer和NSNode、UIView的区别是?
NSNode、UIView中的NSNode是可以放入到后台线程去处理的。是线程安全的。
而UIView和CALayer包括UIKit的内容都是在主线程上做的。

NSNode对UIView进行了一次包装,包括文本宽高计算、视图布局计算、文本渲染、图片解码、徒刑绘制、对象的创建、对象调整、对象销毁,通过操作NSNode来实现,还可以放入到后台执行。

总结:

  • 针对ASNode的修改和提交,会对其进行封装并提交到一个全局容器中去。
    • 对UIView的修改都落地到NSNode的修改, 模仿系统CAAnimation提交CALayer的setNeedsDisplay这种形式把对NSNode的修改也会提交到全局容器当中
  • ASDK在Runllop中注册了一个Observer
  • 当RunLoop进入休眠前,ASDK执行该loop内提交的所有任务。

面试题

AFNetworking的整体结构是什么?

绘画模块、网络监听模块、安全模块,核心类是AFURLSessionManager

SDWebImage框架是怎么样加载图片的?

查找内存、在查找磁盘、都没有的情况下去网路下载,
内存的设计是什么?

RAC的信号订阅是什么意思,我们该怎么样去理解?

信号是一连串的状态的抽象,订阅信号就是通过RCASubscriber来实现,传递过去的block作为成员变量保存下来,然后RCASubscriber在具体的去调用`sentNext这个方法来执行这个block?

ASDK的实现原理?

封装一个NSNode节点,对于视图的属性设置都转化成NSNode的设置而这一部分又可以放入到后台线程线去实现,然后我们在合适的时机,也就是在RunLoop结束的时候接收一个通知,提取全局容器当中的对应的NSNode然后在一次性设置UIView,这个就是ASDK的实现原理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容