zoukankan      html  css  js  c++  java
  • iOS 监听数组的变化

    这里用的是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<NSKeyValueChangeKey,id> *)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:了。
  • 相关阅读:
    MPLS 知识要点1
    ISIS的SSN和SRM标志
    对比ISIS和OSPF
    ISIS帧中继实验
    ISIS 认证实验
    ISIS数据库同步
    ISIS Lab 路由泄露
    ISIS Lab 重分布直连
    32、端口有效范围是多少到多少?
    33、为何需要把 TCP/IP 协议栈分成 5 层(或7层)?开放式回答。
  • 原文地址:https://www.cnblogs.com/cui-cui/p/9234333.html
Copyright © 2011-2022 走看看