iOS KVO监听数组元素的变化

前言

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

具体实现步骤

首先,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];

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,102评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,532评论 1 32
  • 种子在春天里做了个梦, 于是便发了芽。
    a6c49d746b27阅读 205评论 0 0
  • 眼 眼,是视觉冲击最直接的接受者。在春节里,应该是眼花缭乱、目不暇接的吧,那是热闹的人山人海的画面。 我喜欢去卖春...
    Echohou阅读 1,669评论 25 1
  • 文:陈秋月 《大败局》作为中国商业界影响最大的二十本图书之一,当之无愧。本书不然成功,大谈失败,从改革开放之初十年...
    秋月930阅读 909评论 0 0

友情链接更多精彩内容