From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001 From: 单军华 Date: Wed, 11 Jul 2018 10:47:42 +0800 Subject: [PATCH] 首次上传 --- screendisplay/Pods/YYCategories/YYCategories/Foundation/NSObject+YYAddForKVO.m | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 110 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/YYCategories/YYCategories/Foundation/NSObject+YYAddForKVO.m b/screendisplay/Pods/YYCategories/YYCategories/Foundation/NSObject+YYAddForKVO.m new file mode 100755 index 0000000..cf8bd73 --- /dev/null +++ b/screendisplay/Pods/YYCategories/YYCategories/Foundation/NSObject+YYAddForKVO.m @@ -0,0 +1,110 @@ +// +// NSObject+YYAddForKVO.m +// YYCategories <https://github.com/ibireme/YYCategories> +// +// Created by ibireme on 14/10/15. +// Copyright (c) 2015 ibireme. +// +// This source code is licensed under the MIT-style license found in the +// LICENSE file in the root directory of this source tree. +// + +#import "NSObject+YYAddForKVO.h" +#import "YYCategoriesMacro.h" +#import <objc/objc.h> +#import <objc/runtime.h> + +YYSYNTH_DUMMY_CLASS(NSObject_YYAddForKVO) + + + + +static const int block_key; + +@interface _YYNSObjectKVOBlockTarget : NSObject + +@property (nonatomic, copy) void (^block)(__weak id obj, id oldVal, id newVal); + +- (id)initWithBlock:(void (^)(__weak id obj, id oldVal, id newVal))block; + +@end + +@implementation _YYNSObjectKVOBlockTarget + +- (id)initWithBlock:(void (^)(__weak id obj, id oldVal, id newVal))block { + self = [super init]; + if (self) { + self.block = block; + } + return self; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if (!self.block) return; + + BOOL isPrior = [[change objectForKey:NSKeyValueChangeNotificationIsPriorKey] boolValue]; + if (isPrior) return; + + NSKeyValueChange changeKind = [[change objectForKey:NSKeyValueChangeKindKey] integerValue]; + if (changeKind != NSKeyValueChangeSetting) return; + + id oldVal = [change objectForKey:NSKeyValueChangeOldKey]; + if (oldVal == [NSNull null]) oldVal = nil; + + id newVal = [change objectForKey:NSKeyValueChangeNewKey]; + if (newVal == [NSNull null]) newVal = nil; + + self.block(object, oldVal, newVal); +} + +@end + + + +@implementation NSObject (YYAddForKVO) + +- (void)addObserverBlockForKeyPath:(NSString *)keyPath block:(void (^)(__weak id obj, id oldVal, id newVal))block { + if (!keyPath || !block) return; + _YYNSObjectKVOBlockTarget *target = [[_YYNSObjectKVOBlockTarget alloc] initWithBlock:block]; + NSMutableDictionary *dic = [self _yy_allNSObjectObserverBlocks]; + NSMutableArray *arr = dic[keyPath]; + if (!arr) { + arr = [NSMutableArray new]; + dic[keyPath] = arr; + } + [arr addObject:target]; + [self addObserver:target forKeyPath:keyPath options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL]; +} + +- (void)removeObserverBlocksForKeyPath:(NSString *)keyPath { + if (!keyPath) return; + NSMutableDictionary *dic = [self _yy_allNSObjectObserverBlocks]; + NSMutableArray *arr = dic[keyPath]; + [arr enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { + [self removeObserver:obj forKeyPath:keyPath]; + }]; + + [dic removeObjectForKey:keyPath]; +} + +- (void)removeObserverBlocks { + NSMutableDictionary *dic = [self _yy_allNSObjectObserverBlocks]; + [dic enumerateKeysAndObjectsUsingBlock: ^(NSString *key, NSArray *arr, BOOL *stop) { + [arr enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { + [self removeObserver:obj forKeyPath:key]; + }]; + }]; + + [dic removeAllObjects]; +} + +- (NSMutableDictionary *)_yy_allNSObjectObserverBlocks { + NSMutableDictionary *targets = objc_getAssociatedObject(self, &block_key); + if (!targets) { + targets = [NSMutableDictionary new]; + objc_setAssociatedObject(self, &block_key, targets, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return targets; +} + +@end -- Gitblit v1.8.0