之前寫了一篇文章《OC實現KVO監聽block方式響應事件》可以實現通過KVO監聽單一元素的變化。今天主要分析一下,通過KVO實現監聽數組變化的實現方案。
監聽數組變化,具體需要監聽什麼
一、監聽數組指針的變化
(1) 數組指針由空到非空
(2) 數組指針由非空到空
(3) 數組指針非空到非空 ps:指針指向的對象不一樣
上面這三種情況主要是針對數組作爲普通的NSObject對象來進行監聽。這些情況都可以通過《OC實現KVO監聽block方式響應事件》這篇文章中提供的方法進行監聽。
二、監聽數組元素變化
(1) 監聽數組元素數量的變化,主要有:增加,刪除,替換引起的變化
(2) 監聽數組元素屬性的變化
目前我這邊只實現了監聽數組元素數量的變化,剩下的後續會進行持續的完善。
如果要實現監控數組元素數量的變化,那麼需要使用如下的方法進行,數組元素的增加,刪除,替換等操作,具體如下:
- (void)kvo_addObject:(id)anObject;
- (void)kvo_insertObject:(id)anObject atIndex:(NSUInteger)index;
- (void)kvo_removeLastObject;
- (void)kvo_removeObjectAtIndex:(NSUInteger)index;
- (void)kvo_replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
- (void)kvo_addObjectsFromArray:(NSArray<id> *)otherArray;
- (void)kvo_exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
- (void)kvo_removeAllObjects;
- (void)kvo_removeObject:(id)anObject;
具體使用如下:
it(@"jk_addObject", ^{
JKTeacher *teacher = [JKTeacher new];
NSMutableArray *students = [NSMutableArray new];
teacher.students = students;
JKPersonModel *person1 = [JKPersonModel new];
person1.name = @"1";
__block BOOL invoked = NO;
[teacher jk_addObserverForKeyPath:@"students" options:NSKeyValueObservingOptionNew withBlock:^(NSDictionary * _Nonnull change, void * _Nonnull context) {
[[[change objectForKey:@"new"] should] haveCountOf:1];
invoked = YES;
}];
[students kvo_addObject:person1];
[[theValue(invoked) shouldEventually] beYes];
});
上面的是單元測試代碼,基本可以看出來如何使用。
源碼下載地址:https://github.com/xindizhiyin2014/JKKVOHelper.git
pod 集成命令:pod 'JKKVOHelper'
歡迎大家多多批評指正。
交流問題可以QQ掃描下方二維碼進羣
更多幹貨文章,歡迎掃描二維碼關注公衆號