设为首页 加入收藏

TOP

深入剖析通知中心和KVO(一)
2017-10-13 10:33:07 】 浏览:2061
Tags:深入 剖析 通知 中心 KVO

深入剖析通知中心和KVO


要先了解KVO和通知中心,就得先说说观察者模式,那么观察者模式到底是什么呢?下面来详细介绍什么是观察者模式。
  • 观察者模式

    -A对B的变化感兴趣,就注册成为B的观察者,当B发生变化时通知A,告知B发生了变化,这就是观察者模式。
    观察者模式定义了一对一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己或者作出相应的一些动作。
    在开发中,我们可能会接触到观察者模式的实现方式,有NSNotificationCenter、KVO等。

下面就来上正菜了,在下面我会给大家详细讲解通知中心和KVO到底是什么,对于这两个,我也是模模糊糊,搞不清到底是什么东西,所以才找了资料,来整理整理,顺便写篇博客分享给大家。
  • 通知中心

    • 通知中心就是以NSNotificationCenter为中心,观察者往Center中注册对某个主题对象的变化感兴趣,主体对象通过NSNotificationCenter进行变化广播,所有的变化和监听行为都向同一个中心进行注册,所有对象的变化也通过同一个中心对外广播。

  • 通知中心的执行顺序

    • 通过NSNotificationCenter的addObserver:selector:name:object接口来注册通知中心

    • 被观察的对象,通过postNotificationName:object:userInfo:向通知中心发送某一类型通知。

    • 当有通知来的时候,Center会调用观察者注册的接口来广播通知,同时传递存储着更改内容的NSNotification对象。

    • 当该通知不再使用时,可以在dealloc方法里removeObserver:删除观察者

  • 代码

main.m

        //
        //  main.m
        //  通知中心
        //
        //  Created by ma c on 16/5/16.
        //  Copyright © 2016年 Jujue. All rights reserved.
        //
        
        #import <Foundation/Foundation.h>
        #import "Observer.h"
        #import "HttpClient.h"
        int main(int argc, const char * argv[]) {
            @autoreleasepool {
                // insert code here...
                
                //1、通知中心注册通知对象
                //2、需要给通知中心发送消息的地方post通知
                //3、执行注册通知时设置的方法
                
                Observer *observer = [[Observer alloc]init];
                //在通知中心注册成为Observer的观察者
                [observer registNotification];
                
                HttpClient *client = [[HttpClient alloc]init];
                //发送消息
                [client postNotifi];
                
            }
            return 0;
        }

Observer.m

     //
    //  Observer.m
    //  通知中心
    //
    //  Created by ma c on 16/5/16.
    //  Copyright © 2016年 Jujue. All rights reserved.
    //
    
    #import "Observer.h"
    
    @implementation Observer
    
    - (void)registNotification
    {
        NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
        //注册成为观察者 观察对象是Observer 
        [notificationCenter addObserver:self selector:@selector(doAction:) name:@"Observer" object:nil];
    }
    
    - (void)doAction:(NSNotification *)notifi
    {
        //发送者是哪个类就输出的是什么东西-这个例子打印出来是 <HttpClient: 0x10020ead0>
    
        NSLog(@"%@",notifi.object);
        
        //打印结果    name = xiaoyu;
        NSLog(@"%@",notifi.userInfo);
    }
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter]removeObserver:self];
    }
    
    @end
    

HttpClient.m

//
//  HttpClient.m
//  通知中心
//
//  Created by ma c on 16/5/16.
//  Copyright © 2016年 Jujue. All rights reserved.
//

#import "HttpClient.h"

@implementation HttpClient


- (void)postNotifi
{
    NSDictionary *info = @{@"name":@"xiaoyu"};
    
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    
    [notificationCenter postNotificationName:@"Observer" object:self userInfo:info];
    
}

@end

KVO(键值观察)
  • KVO是一个典型的观察者模式,观察者在键值改变时会得到通知。iOS中有个Notification的机制,也可以获得通知,但这个机制需要有个Center,相比之下KVO更加简洁而直接。

  • NSKeyValueObserving非正式协议定义了一种机制,它允许对象去监听其它对象的某个属性的修改。NSObject提供了一个NSKeyValueObserving协议的默认实现,它为所有对象提供了一种自动发送修改通知的能力。我们可以通过禁用自动发送通知并使用这个协议提供的方法来手动实现通知的发送,以便更精确地去处理通知。

  • KVO的实现步骤

    • (1)注册需要观察的对象的属性addObserver:forKeyPath:options:context:

    • (2)实现observeva lueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用.在这个方法中还通过NSKeyValueObservingOptionNew这个参数要求把新值在dictionary中传递过来。
    • (3)取消注册观察removeObserver:forKeyPath:context:

  • 手动设置KVO

    //关闭某key值的KVO
    
    + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    
        BOOL a
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇OC NSFileManager(文件路径操作) 下一篇swift 2.2 语法 (中)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目