面试iOS

iOS KVO监听数组元素的变化

2018-10-29  本文已影响0人  Superman168

前言

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

具体实现步骤

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

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

上一篇下一篇

猜你喜欢

热点阅读