NSObject+SafeKVO.m 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // NSObject+SafeKVO.m
  3. // WMZPageController
  4. //
  5. // Created by wmz on 2019/10/16.
  6. // Copyright © 2019 wmz. All rights reserved.
  7. //
  8. #import "NSObject+SafeKVO.h"
  9. @implementation NSObject (SafeKVO)
  10. - (void)pageAddObserver:(nonnull NSObject *)observer forKeyPath:(nonnull NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context {
  11. if (![self hasKey:keyPath withObserver:observer]) {
  12. [self addObserver:observer forKeyPath:keyPath options:options context:context];
  13. }
  14. }
  15. - (void)paegRemoveObserver:(nonnull NSObject *)observer forKeyPath:(nonnull NSString *)keyPath context:(nullable void *)context {
  16. if ([self hasKey:keyPath withObserver:observer]) {
  17. [self removeObserver:observer forKeyPath:keyPath context:context];
  18. }
  19. }
  20. - (void)removeAllObserverdKeyPath:(NSObject*)VC withKey:(NSString*)key{
  21. id info = self.observationInfo;
  22. NSArray *arr = [info valueForKeyPath:@"_observances._property._keyPath"];
  23. NSArray *objArr = [info valueForKeyPath:@"_observances._observer"];
  24. if (arr) {
  25. for (int i = 0; i<arr.count; i++) {
  26. NSString *keyPath = arr[i];
  27. NSObject *obj = objArr[i];
  28. if ([keyPath isEqualToString:key]&&obj == VC) {
  29. [self removeObserver:VC forKeyPath:keyPath context:nil];
  30. }
  31. }
  32. }
  33. }
  34. - (BOOL)hasKey:(NSString *)kvoKey withObserver:(nonnull NSObject *)observer {
  35. BOOL hasKey = NO;
  36. id info = self.observationInfo;
  37. NSArray *arr = [info valueForKeyPath:@"_observances._property._keyPath"];
  38. NSArray *objArr = [info valueForKeyPath:@"_observances._observer"];
  39. if (arr) {
  40. for (int i = 0; i<arr.count; i++) {
  41. NSString *keyPath = arr[i];
  42. NSObject *obj = objArr[i];
  43. if ([keyPath isEqualToString:kvoKey]&&obj == observer) {
  44. hasKey = YES;
  45. break;
  46. }
  47. }
  48. }
  49. return hasKey;
  50. }
  51. @end