美文网首页面试iOS
iOS KVO监听数组元素的变化

iOS KVO监听数组元素的变化

作者: Superman168 | 来源:发表于2018-10-29 15:46 被阅读0次

前言

在开发过程中,不管是出于什么需求,有的时候(自我感觉比较少)就可能会遇到监听数组元素的变化,来做一些响应的操作

具体实现步骤

首先,iOS默认不支持对数组的KVO,因为普通方式监听的对象的地址的变化,而数组地址不变,而是里面的值发生了改变,所以我们需要做一些响应的处理,让监听数组和监听一个类的属性一样。

  1. 创建观察者及观察的对象
    观察者:ObserverClass
    观察的对象:dataArray
    创建一个 ObserverClass 的类,定义一个 dataArray 属性:
#import <Foundation/Foundation.h>

@interface ObserverClass : NSObject

@property (strong,nonatomic)NSMutableArray *dataArray;

@end

.m


#import "ObserverClass.h"

@implementation ObserverClass

-(NSMutableArray *)dataArray{
    if(!_dataArray){
        _dataArray = [NSMutableArray array];
    }
    return _dataArray;
}


@end
  1. 监听 key 的变化 (key 即为监听的数组),做相应的处理。
    (备注:数组中不管是添加还是删除元素都会触发监听方法!!!)
    在需要引入的地方,实例化观察者对象,实现监听方法:
// 定义
{
    ObserverClass *obserVer;
}

{
    obserVer = [[ObserverClass alloc] init];
    [obserVer addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew context:nil];
}

现监听方法:

#pragma mark -- 监听调用方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{    
    if ([keyPath isEqualToString:@"dataArray"]) {
        //
        if (obserVer.dataArray.count > 0) {
//            if (!_iFlySpeechSynthesizer.isSpeaking) {
                curVoice = obserVer.dataArray.firstObject;
                [_iFlySpeechSynthesizer startSpeaking:curVoice];
//            }
        }
    }
}
  1. 移除观察者
-(void)dealloc{
    [obserVer removeObserver:self forKeyPath:@"dataArray"];
}

我在 AppDelegate 中监听的,故省去。

以上就可以实现了对一个数组的监听,在需要引入的地方,实现即可。

数组操作

最后,数组的添加删除,就不能用一定不要用 addObject: 和 removeObject: 方法了,那样肯定会崩溃的,而要用:

    [[obserVer mutableArrayValueForKeyPath:@"dataArray"] addObject:voiceContent];
    [[obserVer mutableArrayValueForKeyPath:@"dataArray"] removeObject:voiceContent];

这样就可以实现对数组元素的变化进行监听达到想要的效果而不崩溃。

相关文章

  • 使用RAC/KVO监听数组的变化

    iOS默认不支持KVO的形式来监听数组的变化,数组改变的时候,只是数组里面的值变化,但数组的地址没有变化,KVO监...

  • iOS KVO监听数组元素的变化

    前言 在开发过程中,不管是出于什么需求,有的时候(自我感觉比较少)就可能会遇到监听数组元素的变化,来做一些响应的操...

  • Swift利用KVO监听数组元素的变化

    一.概述KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会...

  • iOS KVO方式监听数组的变化

    iOS默认不支持对数组的KVO,因为普通方式监听的对象的地址的变化,而数组地址不变,而是里面的值发生了改变。 第一...

  • iOS KVO方式监听数组变化方法

    iOS默认不支持对数组的KVO,因为普通方式监听的对象的地址的变化,而数组地址不变,而是里面的值发生了改变 整个过...

  • KVO如何才能直接监听到数组的变化

    转自关于使用KVO监听数组的问题 首先,数组不能直接使用KVO使用监听。当我们想要使用KVO监听数组的状态时改变然...

  • iOS监听控制器数组变化

    用KVC监听viewcontroller的数组变化,在控制器里面有一个可变数组属性 若是用KVO监听数组mArra...

  • KVO—监听数组长度的变化

    通过KVO监听数组时,当直接通过.语法获取的数组来添加或删除元素时并不会触发KVO,需要通过KVC的方式来获取数组...

  • flutter ValueNotifier 监听失败

    定义 监听 赋值:方法1,无法触发监听 赋值:方法2,可以触发监听 原理与iOS的kvo原理类似.list添加元素...

  • iOS KVO监听可变数组变化

    有时候我们会想监听一个可变数组的变化来执行一些操作但是直接监听当前ViewController中的数组不管是cou...

网友评论

    本文标题:iOS KVO监听数组元素的变化

    本文链接:https://www.haomeiwen.com/subject/rrvbtqtx.html