Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS小技能:MVVM数据绑定的实现方式(KVO、block、Delegate、Notification、RAC)

iOS小技能:MVVM数据绑定的实现方式(KVO、block、Delegate、Notification、RAC)

作者头像
公众号iOS逆向
发布于 2022-08-22 03:23:54
发布于 2022-08-22 03:23:54
1.6K00
代码可运行
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
运行总次数:0
代码可运行

前言

MVVM 的实现可以采用KVO进行数据绑定,也可以采用RAC。--- 其实还可以采用block、代理(protocol)实现。

在这里插入图片描述

通信间传递消息的几种方式:block、protocol、通知

I block 与protocol 相比的优点

block 的作用:保存一段代码,到恰当的时候调用,很多时候block是代理的一种优化方案

  1. block比protocol更灵活,更高聚合,低耦合。例如AFN的网络框架中,就可以将“准备请求参数”的代码和“处理后台返回数据”的代码放在一起。
  2. block的灵活还体现在他可以当作方法参数以及返回值。Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。

在OC中,block是以()的形式去执行的,如果方法返回一个block的话,就可以用()来实现链式编程的效果!

低耦合通信除了block、protocol之外,还有KVO。

1.1 block的内部实现原理及使用

https://blog.csdn.net/z929118967/article/details/74203019

1.2 db快速打印Objective-C方法中block参数的签名

lldb快速打印Objective-C方法中block参数的签名:Python script for lldb that prints an Objective-C block signature

II KVO 与protocol、block相比的优点

实现的方式中,KVO,不需要通过通知中心就可以进行属性值的监听;与bock以及代理相比,可以减少代理大量的方法和block大量的处理逻辑代码。

监听的四种类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) {
    // 提供属性的新值
    NSKeyValueObservingOptionNew = 0x01,
    // 提供属性的旧值
    NSKeyValueObservingOptionOld = 0x02,
    // 如果指定,则在添加观察者的时候立即发送一个通知给观察者,
    // 并且是在注册观察者方法返回之前
    NSKeyValueObservingOptionInitial = 0x04,
    // 如果指定,则在每次修改属性时,会在修改通知被发送之前预先发送一条通知给观察者,
    // 这与-willChangeValueForKey:被触发的时间是相对应的。
    // 这样,在每次修改属性时,实际上是会发送两条通知。
    NSKeyValueObservingOptionPrior = 0x08

2.1 KVO举例(观察者模式)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

- (void)addObserver:(NSObject *)anObserver
         forKeyPath:(NSString *)keyPath
            options:(NSKeyValueObservingOptions)options
            context:(void *)context
            

  1. anObserver:观察者对象,这个对象必须实现observeValueForKeyPath:ofObject:change:context:方法,以响应属性的修改通知,否则将报错 An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
  2. keyPath:被监听的属性。这个值不能为nil。
  3. options:监听选项,这个值可以是NSKeyValueObservingOptions选项的组合。关于监听选项,我们会在下面介绍。
  4. context:任意的额外数据,我们可以将这些数据作为上下文数据,它会传递给观察者对象的observeValueForKeyPath:ofObject:change:context:方法。这个参数的意义在于用于区分同一对象监听同一属性的多个不同的监听。

监听属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        [tmp addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:nil];

在dealloc中调用 移除监听

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)dealloc {
    // 移除监听
    [self.webVIew removeObserver:self forKeyPath:@"xxxx"];
}

属性监听的回调方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**

keyPath:即被观察的属性,与参数object相关。
object:keyPath所属的对象。
change:这是一个字典,它包含了属性被修改的一些信息。这个字典中包含的值会根据我们在添加观察者时设置的options参数的不同而有所不同。
context:这个值即是添加观察者时提供的上下文信息。

// 属性变化的类型,是一个NSNumber对象,包含NSKeyValueChange枚举相关的值
NSString *const NSKeyValueChangeKindKey;
 
// 属性的新值。当NSKeyValueChangeKindKey是 NSKeyValueChangeSetting,
// 且添加观察的方法设置了NSKeyValueObservingOptionNew时,我们能获取到属性的新值。
// 如果NSKeyValueChangeKindKey是NSKeyValueChangeInsertion或者NSKeyValueChangeReplacement,
// 且指定了NSKeyValueObservingOptionNew时,则我们能获取到一个NSArray对象,包含被插入的对象或
// 用于替换其它对象的对象。
NSString *const NSKeyValueChangeNewKey;
 
// 属性的旧值。当NSKeyValueChangeKindKey是 NSKeyValueChangeSetting,
// 且添加观察的方法设置了NSKeyValueObservingOptionOld时,我们能获取到属性的旧值。
// 如果NSKeyValueChangeKindKey是NSKeyValueChangeRemoval或者NSKeyValueChangeReplacement,
// 且指定了NSKeyValueObservingOptionOld时,则我们能获取到一个NSArray对象,包含被移除的对象或
// 被替换的对象。
NSString *const NSKeyValueChangeOldKey;
 
// 如果NSKeyValueChangeKindKey的值是NSKeyValueChangeInsertion、NSKeyValueChangeRemoval
// 或者NSKeyValueChangeReplacement,则这个key对应的值是一个NSIndexSet对象,
// 包含了被插入、移除或替换的对象的索引
NSString *const NSKeyValueChangeIndexesKey;
 
// 当指定了NSKeyValueObservingOptionPrior选项时,在属性被修改的通知发送前,
// 会先发送一条通知给观察者。我们可以使用NSKeyValueChangeNotificationIsPriorKey
// 来获取到通知是否是预先发送的,如果是,获取到的值总是@(YES)
NSString *const NSKeyValueChangeNotificationIsPriorKey;

——————————————
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

    if([keyPath isEqualToString:@"transform"]){
        
        CGRect fontBarFrame = self.fontBar.frame;
        fontBarFrame.origin.y = CGRectGetMaxY(self.toolBarView.frame)- KWFontBar_Height - KWEditorBar_Height;
        self.fontBar.frame = fontBarFrame;
        
        
    }else if([keyPath isEqualToString:@"URL"]){
        
        
        NSString *urlString = self.editorView.URL.absoluteString;
        NSLog(@"URL------%@",urlString);
        
        [self handleEvent:urlString];
        
    }else{
        //默认处理
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
    
}


2.2 ReactiveCocoa

RAC 提供了优雅安全的数据绑定。

RAC是函数响应式编程(FRP)框架。ReactiveCocoa结合了几种编程风格:函数式编程(Functional Programming)响应式编程(Reactive Programming)

优雅集中体现在函数式编程,安全体现在响应式编程。

使用RAC解决问题,就不需要考虑调用顺序。每一次操作都写成一系列嵌套的方法中,使代码高聚合,方便管理。

案例:iOS富文本编辑器(基于WKWebview实现,Editor使用WKWebview加载一个本地editor.html文件) https://download.csdn.net/download/u011018979/85675638

III、MVVM的实现总结

在 iOS 的 MVVM 实现中,我们可以使用 RAC 来在 view 和 viewModel 之间充当 binder 的角色,优雅地实现两者之间的信息同步。此外,我们还可以把 RAC 用在 model 层,使用 Signal 来代表异步的数据获取操作,比如读取文件、访问数据库和网络请求等(同样可以在 MVC 的 model 层这么用)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS - 关于 KVO 的一些总结
KVO使用三部曲:添加/注册KVO监听、实现监听方法以接收属性改变通知、 移除KVO监听。
师大小海腾
2020/04/16
2.6K0
iOS - 关于 KVO 的一些总结
编码篇-KVO的使用大全
设置类的A属性依赖于B、C属性时,对类的A属性进行观察,当B、C属性发生改变时,也会触发对A的观察者方法。
進无尽
2018/09/12
6630
编码篇-KVO的使用大全
详解:RxSwift-KVO底层探索(上)
下面我们开始分析,首先感谢苹果开源精神,在Github可以直接下载,我们通过 Swift 源码展开分析
猿_人类
2019/08/09
8120
KVO实现原理
KVO(key value observing)键值监听是我们在开发中常使用的用于监听特定对象属性值变化的方法,常用于监听数据模型的变化
猿_人类
2019/05/29
1.2K0
iOS KVC和KVO
无论是在我们的今后的工作当中还是面试找工作当中,这两个知识点是十分重要的,有些同学们对这方面的知识还是不是很了解,概念模糊,这里我整理下相关的内容知识分享给大家。
conanma
2021/10/28
8850
KVO详解及底层实现
什么是KVO?? KVO就是NSKeyValueObserving,请看官方文档的解释: 大概翻译如下: 一种非正式协议,通知其他对象的指定属性发生了改变。 简单理解就是,可以监听一个对象的某个属性是
czjwarrior
2018/05/28
2.4K0
iOS键值观察KVO实例详解简介实例效果实现方式进阶用法
什么是KVO?KVO是Key-Value Observing的简称,翻译成中文就是键值观察。这是iOS支持的一种机制,用来做什么呢?我们在开发应用时经常需要进行通信,比如一个model的某个数据变化了,界面上要进行相应的变化,但是如果我们程序并不知道数据什么时候会进行变化,总不能一直循环判断有没有变化吧,那么就需要在数据变化时给controlller发送一个通知,告知我变化了,你可以更新显示内容了,通知的方式有很多种,比如Notification也是其中一种方式,本文要讲解的KVO也是其中一种很轻巧的方式。
Cloudox
2021/11/23
4010
iOS键值观察KVO实例详解简介实例效果实现方式进阶用法
KVO 在 iOS开发中的应用
如果我更改了一个属性的值,KVO会帮助我们检测这个值的变化,从而通知我们这个值改变了。典型的观察者模式。当然我想起在UNITY3D中,如果检视面板的数值发生改变对应的GameObject发生位移之类的。我曾经实现了一个inspector的编辑器类,值改变直接通知(其实是调用)对应的函数。在iOS这里 一切发生的那么自然。不需要额外实现 这是iOS的特性之一 名曰:KVO 。
keyle
2024/11/01
2110
KVO 在 iOS开发中的应用
kvo底层实现 以及自己实现kvo
调用 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil
conanma
2021/05/12
8060
iOS中KVC与KVO的应用解析 原
KVC键值编码是Object-C为我们提供的一种对成员变量赋值的方法。在探讨其方法之前,我们先来看一个小例子:
珲少
2018/08/15
3580
KVO编程指南
苹果官方文档Key-Value Observing Programming Guide
Helloted
2022/06/07
9720
KVO编程指南
iOS底层原理总结 - 探寻KVO本质
对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索问题的本质内容。 问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO 首先需要了解KVO基本使用,KVO的全称 Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变。 - (void)viewDidLoad { [super viewDidLoad]; Person *p1 = [[Person alloc] init]; Pers
xx_Cc
2018/05/10
9410
# iOS中的KVO底层实现
KVO是Key-Value-Observer的缩写,使用的是观察者模式。底层实现机制都是isa-swizzing,就是在底层调用object_setClass函数,将对象的isa指向的Class偷偷换掉。
Haley_Wong
2019/03/29
1.3K0
ios KVO及实现原理
概述 KVO全称KeyValueObserving,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。由于KVO的实现机制,所以对属性才会发生作用,一般继承自NSObject的对象都默认支持KVO。
赵哥窟
2018/09/13
6930
KVO 正确使用姿势进阶及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里
你要知道的KVC、KVO、Delegate、Notification都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨KVO、Delegate、Notification的区别以及相关使用场景,本系列文章将分一下几篇文章进行讲解,读者可按需查阅。 KVC 使用方法详解及底层实现 KVO 正确使用姿势进阶及底层实现 Protocol与Dele
WWWWDotPNG
2018/04/10
1.6K0
KVO 正确使用姿势进阶及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里
面试驱动技术 - KVO && KVC
what?怎么跑出来一个NSKVONotifying_MNPerson?person的class 不是MNPerson 吗?
小蠢驴打代码
2019/03/15
1.2K0
iOS 开发:『Crash 防护系统』(二)KVO 防护
KVO(Key Value Observing) 翻译过来就是键值对观察,是 iOS 观察者模式的一种实现。KVO 允许一个对象监听另一个对象特定属性的改变,并在改变时接收到事件。但是 KVO API 的设计,我个人觉得不是很合理。被观察者需要做的工作太多,日常使用时稍不注意就会导致崩溃。
程序员充电站
2020/10/26
4.5K0
KVO实现原理
本文主要探讨了Objective-C的KVO(Key-Value Observing)实现原理和实现细节,以及其和runtime的关系。通过示例代码,讲解了KVO的用法和实现。同时,也介绍了一些KVO的高级用法,如使用block回调观察属性的变化,以及使用objc_setAssociatedObject和objc_getAssociatedObject方法来观察属性的变化。最后,总结了KVO的使用方法和注意事项。
MelonTeam
2018/01/04
1.2K0
iOS:KVO/KVC 的概述与使用
KVO 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。 二,使用方法 系统框架已经支持KVO,所以程序员在使用的时候非常简单。 1. 注册,指定被观察者的属性, 2. 实现回调方法 3. 移除观察 三,实例: 假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。 1.定义DataModel, [cpp] view
用户1941540
2018/05/11
1.6K0
探究ReactiveCocoa 底层KVO封装流程
但是RACKVO只是用了非常简单的一段代码就实现了以上的这三个步骤,去掉了胶水代码,真正的做到了面向业务开发,那它是怎么实现的呢,接下来我们来一层层分析
iOSSir
2019/06/10
4010
相关推荐
iOS - 关于 KVO 的一些总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验