iOS自动移除KVO观察者的实现方法-创新互联

问题

在网站设计制作、成都网站制作过程中,需要针对客户的行业特点、产品特性、目标受众和市场情况进行定位分析,以确定网站的风格、色彩、版式、交互等方面的设计方向。成都创新互联还需要根据客户的需求进行功能模块的开发和设计,包括内容管理、前台展示、用户权限管理、数据统计和安全保护等功能。

KVO即:Key-Value Observing, 直译为:基于键值的观察者。 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。 简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

KVO的优点:当有属性改变,KVO会提供自动的消息通知。 这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。 这是KVO机制提供的大的优点。 因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。 开发人员不需要添加任何代码,不需要设计自己的观察者模型,直接可以在工程里使用。 其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同一个属性,以及相关的值。

但我们都知道, 使用KVO模式, 对某个属性进行监听时, Observer 需要在必要的时刻进行移除, 否则 App 必然会 Crash. 这个问题有点烦人, 因为偶尔会忘记写移除 Observer 的代码...

我一直想要这样一个效果:

只管监听, 并处理监听方法. 不去分心, 管何时移除 Observer , 让其能够适时自动处理.

所幸, 它能够实现, 先预览一下:

@interface NSObject (SJObserverHelper)

- (void)sj_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

@end

@interface SJObserverHelper : NSObject
@property (nonatomic, unsafe_unretained) id target;
@property (nonatomic, unsafe_unretained) id observer;
@property (nonatomic, strong) NSString *keyPath;
@property (nonatomic, weak) SJObserverHelper *factor;
@end

@implementation SJObserverHelper
- (void)dealloc {
 if ( _factor ) {
 [_target removeObserver:_observer forKeyPath:_keyPath];
 }
}
@end

@implementation NSObject (ObserverHelper)

- (void)sj_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath {
 
 [self addObserver:observer forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:nil];
 
 SJObserverHelper *helper = [SJObserverHelper new];
 SJObserverHelper *sub = [SJObserverHelper new];
 
 sub.target = helper.target = self;
 sub.observer = helper.observer = observer;
 sub.keyPath = helper.keyPath = keyPath;
 helper.factor = sub;
 sub.factor = helper;
 
 const char *helpeKey = [NSString stringWithFormat:@"%zd", [observer hash]].UTF8String;
 objc_setAssociatedObject(self, helpeKey, helper, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
 objc_setAssociatedObject(observer, helpeKey, sub, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:iOS自动移除KVO观察者的实现方法-创新互联
网址分享:http://pwwzsj.com/article/gschj.html