这里用的是KVO的方式来实现的,

首先有一个 testArray 这个数组需要监听里面的数据变化

NSMutableArray *testArray;

然后给这个数组注册监听

testArray = [NSMutableArray array];

[self addObserver:self forKeyPath:@"testArray" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

其中 forKeyPath 就是 你定义的这个数组的名字。

具体实现代码如下:

#import "ViewController.h"

@interface ViewController ()

{

NSMutableArray *testArray;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

testArray = [NSMutableArray array];

//注册监听

[self addObserver:self forKeyPath:@"testArray" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

// Do any additional setup after loading the view, typically from a nib.

}

-(IBAction)clickBtn:(id)sender

{

//给数组添加数据

[[self mutableArrayValueForKey:@"testArray"] addObject:@"1"];

}

//回调方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

NSLog(@"keyPath = %@", keyPath);

NSLog(@"object = %@", object);

NSLog(@"change = %@", change);

}

这里需要注意的是这个数组添加对象的方式跟平时用的有点不一样,如果用常规的

[testArray addObject:@"1"]是无法触动监听的,这里需要用到这个方法才能触发

[[self mutableArrayValueForKey:@"testArray"] addObject:@"1"],

关于mutableArrayValueForKey:的适用场景,发现其一般是用在对NSMutableArray添加Observer上。如果对象属性是个NSMutableArray、NSMutableSet、NSMutableDictionary等集合类型时,你给它添加KVO时,你会发现当你添加或者移除元素时并不能接收到变化。因为KVO的本质是系统监测到某个属性的内存地址或常量改变时,会添加上- (void)willChangeValueForKey:(NSString *)key和- (void)didChangeValueForKey:(NSString *)key方法来发送通知,所以一种解决方法是手动调用者两个方法,但是并不推荐,你永远无法像系统一样真正知道这个元素什么时候被改变。另一种便是利用使用mutableArrayValueForKey:了。

ios 监听数组个数的变化_iOS 监听数组的变化相关推荐

  1. [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案?

    [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案? 无法监听时的方案: 数组:改变数组的值:this.$set() 改变数组长度:arr.sp ...

  2. web前端面试高频考点——Vue原理(理解MVVM模型、深度/监听data变化、监听数组变化、深入了解虚拟DOM)

    系列文章目录 内容 参考链接 Vue基本使用 Vue的基本使用(一文掌握Vue最基础的知识点) Vue通信和高级特性 Vue组件间的通信及高级特性(多种组件间的通信.自定义v-model.nextTi ...

  3. vue中进行窗口变化的监听

    今天vue项目中用到的元素的宽度依赖与窗口的宽度,所以在进行宽度设置的时候涉及到窗口的变化,因为元素的宽度要随着窗口变化 分成几个步骤来实现这一过程 1.首先元素的宽度依赖与窗口的宽度,就需要有接受窗 ...

  4. ios 取出数组中前两个元素_ios 怎么获取数组中第一个元素

    2016-08-30 回答 system.out.println("我是java的打印"); 在object-c 则如此: 打印一个nsstring: nsstring str = ...

  5. php 监听条码枪输入,使用jQuery监听扫码枪输入并禁止手动输入的实现方法

    @(知识点总结)[jquery|扫码抢] 基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展. 一.功能需求 使用扫码枪扫描条 ...

  6. java 监听鼠标点击_java 事件监听 - 鼠标

    java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...

  7. php 监听条码枪输入,运用jQuery监听扫码枪输入并制止手动输入的完成要领

    基于jQuery的扫码枪监听.假如只是想完成监听猎取条码扫码信息,能够直接拿来运用,假如有更多的条码推断处置惩罚逻辑须要本身扩大. 一.功用需求 运用扫码枪扫描条码,在一个web页面监听猎取扫码枪的数 ...

  8. php 监听条码枪输入,使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)...

    基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展. 一.功能需求 使用扫码枪扫描条码,在一个web页面监听获取扫码枪的数据, ...

  9. 2个数组合并排序 php,php数组的排序|数组的合并

    数组的排序, 数组的合并, 数组成员的统计, 数组的交差并补等,任意选一个专题,至少10个函数,写出演示案例数组的排序, 数组的合并, 数组成员的统计, 数组的交差并补等,任意选一个专题,至少10个函 ...

最新文章

  1. 2008 R2 AD通过组策略针对用户进行限制QQ等软件的运行
  2. 编码过程中的问题总结
  3. tabbar怎么些_vue 做的tabBar组件
  4. 移动设备将成为2014年最大的安全风险
  5. 食物链 POJ - 1182
  6. Spring的基本使用
  7. 标签选择器与字体连写
  8. C#学习笔记(三):值类型、引用类型及参数传递
  9. mysql 定位字符串的位置
  10. ExtJS初学——renderTo/applyTo区别
  11. 服务器linux杀网页木马,一次Linux服务器木马查杀经历
  12. 计算机复制教程,ghost复制c盘到另一个硬盘方法
  13. python判断可逆素数_可逆素数 - 寂寞暴走伤的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. ajax post forbidden,解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式
  15. [博学谷学习记录]超强总结,用心分享|第07节 常用的API-----笔记篇
  16. 学生用计算机重启,学生用计算器咋关机
  17. 前端寒假css(100-181)
  18. dB与放大倍数的关系
  19. 腾讯Android面试:Handler中有Loop死循环,为什么没有阻塞主线程,原理是什么
  20. js输出当前星期几--switch case

热门文章

  1. IntelliJ IDEA常用的快捷键积累总结
  2. status的状态码
  3. 输入一个日期,计算这个日期与 2018-03-12差多少天;
  4. EasyPR源码剖析(4):车牌定位之Sobel算子定位
  5. Linux设备中的并发控制
  6. HDU 5666 Segment 数论+大数
  7. Linux 学习记录
  8. 自定义控件--CircleImageView(类似于QQ、微信圆形头像自定义控件)
  9. 【AS3代码】正则表达式的各种用法和小实例
  10. Zabbix Server 3.0官方跟踪连接接口