Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2024年02月 大数据教学课程 017-Hadoop环境配置
vim /etc/udev/rules.d/70-persistent-net.rules
愚公搬代码
2025/06/02
310
【愚公系列】2024年02月 大数据教学课程 017-Hadoop环境配置
学习小组Day2-bubble
后两种不推荐子系统是因为感觉比较麻烦而且我不喜欢在原有系统下节外生枝别的其它系统我喜欢一对一
bubble
2023/10/31
2670
day2-白雪
4,Linux不分各种磁盘,文件系统呈现树状,系统目录无法使用,主要可用的是home文件夹
用户10300557
2023/01/11
2.1K1
一言不合就改成 777 权限?会出人命的!
最近和几个朋友开发项目,期间使用了一台服务器跑模型,这台服务器是多人公用的,很多人都在上面有自己的账号,互不干涉内政,一切看起来十分井然有序。
崔庆才
2018/10/08
3.4K0
cannot open image file 1:-1_linux C
OSError: Failed to open file b’C:\Users\\xe6\x96\x87…\ AppData\Local\Temp\scipy-xxxxx 报错)
全栈程序员站长
2022/09/30
1.3K0
cannot open image file 1:-1_linux C
Linux 文件属性及详细操作
目录 Linux 文件属性 文件属性信息组成 文件属性概念说明 文件软硬链接说明 硬链接 软链接 补充知识 存储数据相关-inode/block inode: block: 读取文件原理图 Linux文件系统 文件用户和用户组 用户相关文件 不使用useradd命令添加用户 Linux 文件属性 文件属性信息组成 图示如下: 文件索引属性信息-inode 文件类型权限信息 文件链接属性信息-硬链接个数 文件属主属性信息-文件所有者 文件属组属性信息-文件所属组 文件大小属性信息-最小单位字节(大
HammerZe
2022/03/25
6530
Linux 文件属性及详细操作
学习小组Day2笔记--刘
目录相当于windows的文件夹,linux系统没有C/D/E/F盘,文件系统呈树状。由于用户不唯一,像类似“我的电脑”这种级别的文件,用户是无法访问的,每个用户能到达的最高级目录“宿主目录”,即用户登录时所在的目录,宿主目录放在home目录下。
用户10340221
2023/02/07
4350
《前端运维》一、Linux基础--02用户与权限
上一篇文章我们学习了基本的指令和vim编辑器的操作方法。这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识。
zaking
2021/05/27
8890
Linux文件 目录与权限
普通文件:纯文本文件、二进制文件、数据格式文件 目录 连接文件 设备与设备文件 套接字:数据接口文件,通常被用在网络上的数据连接。第一个属性为s,通常在/var/run 这个目录中可以看到这种文件类型。 管道(FIFO,pipe):它的主要目的在解决多个程序同时访问一个文件所造成的错误问题。第一个属性为p
韦东山
2020/09/30
6.5K0
2018年7月31日学习ubuntu的基础操作命令和打包压缩解压缩
今天遇到的新单词: faith n 信用,信任 usage n 用法 upload n上传
武军超
2018/09/27
9640
12步搞定WSL 2,安装、交互、迁移、VSCode远程调试应有尽有
WSL是Windows Subsystem for Linux的缩写,允许利用CPU的虚拟化技术在Windows系统下使用Linux系统。目前最新版本是WSL2。
蒙娜丽宁
2021/10/09
10.7K0
Linux常用命令
有人因喜好而使用Linux,有人因需要而学习Linux。无论出于什么原因,当你刚接触它时就像你刚接触Windows时一样。
bugsuse
2020/04/20
6570
Linux基础知识第七讲,用户权限以及用户操作命令
下面用横线标出了. d代表这个是个目录 rwx 代表当前用户对这个文件/目录 是可读可写可执行 权限每3个一组. r-x 代表了当前组对这个文件/目录 是可读 可执行 r-x 最后一列则是其它用户对这个文件/目录的 权限. 后面依次跟的就是 硬链接数 当前用户(IBinary) 组名称(IBinary) 一般组名称跟用户名称一样. 在后面就是文件的大小 时间 以及文件名了.
IBinary
2019/05/25
1.2K0
Linux
安装:https://cn.ubuntu.com/download/server/step1
不吃紫菜
2022/08/18
6010
OpenHarmony 内核源码分析(文件概念篇) | 为什么说一切皆是文件
大家普遍理解的文件属于此类,(如:图片,视频,mp3,ppt,zip == ),这类文件也叫正则文件,当然是无处不在.
小帅聊鸿蒙
2025/03/26
870
【Linux】权限(shell运行原理、概念,Linux权限)
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html
秦jh
2024/04/23
5890
【Linux】权限(shell运行原理、概念,Linux权限)
Linux基础入门+基本命令的万字碎碎念
之前一直没系统的学习过 Linux,也就简单的用过Ubuntu,或者在本地的虚拟机上,搭了搭开发的环境,以及半查半折腾的在阿里云的 CentOS 系统上部署了一个博客,现在因为有时候用的稍微多了一点,正好家里也有几本Linux的书,那就把这一部分好好学习,顺便整理一下,难免会有一些错误,有什么问题希望大家不吝赐教 ~
BWH_Steven
2020/04/26
8390
Linux用户权限管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管 理员申请一个账号,然后以这个账号的身份进入系统。
星陨1357
2023/03/14
16.2K0
Linux用户权限管理
Linux权限管理
之前在用户管理中提到用户和组的概念,服务器添加多账户的作用之一是可以针对不同用户分配不同的权限,从而根据不同权限限制用户可以访问到的系统资源。那么这次就来说一下Linux权限管理的相关内容,这部分也是非常重要的。如下。
reload
2024/02/04
4250
Linux权限管理
linux文件系统
Linux 文件系统是 Linux 操作系统中的重要组成部分,它是文件和目录的组织方式,为用户提供了一个良好的管理和访问文件的方式。Linux 文件系统具有以下特点:
堕落飞鸟
2023/04/01
9.2K0
相关推荐
【愚公系列】2024年02月 大数据教学课程 017-Hadoop环境配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验