zoukankan      html  css  js  c++  java
  • iOS开发之通知机制

    1、通知中心

    每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信

    任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么。其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知

    通知与代理的区别:通知是多对多的(类似android中的广播),代理是一对一的。

    比如,键盘弹出的时候也会发送一条通知。

    2、通知(NSNotification)

    一个完整的通知一般包含3个属性:

    - (NSString *)name; // 通知的名称

    - (id)object; // 通知发布者(是谁要发布通知)

    - (NSDictionary *)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)

    创建一个通知(NSNotification)对象:

    (1)+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;

    (2)+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

    ( 3 )- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;

    实际上创建通知对象并不是必须的,更方便的是通过通知中心发送通知。

    3、发布通知

    通知中心(NSNotificationCenter)提供了相应的方法来帮助发布通知。

    获得通知中心对象:

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    通知中心提供的发布通知的方法:

    - (void)postNotification:(NSNotification *)notification;

    发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等

    - (void)postNotificationName:(NSString *)aName object:(id)anObject;

    发布一个名称为aName的通知,anObject为这个通知的发布者

    - (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

    发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息

    4、注册通知监听器

    通知中心(NSNotificationCenter)提供了方法来注册一个监听通知的监听器(Observer)

    方法一:

    - (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

    observer:监听器,即谁要接收这个通知

    aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入,意思是收到通知后调用接收者中的哪个方法

    aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知,意思是监听哪个aName的通知

    anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知,意思是监听哪个对象发出的通知

    例如:监听输入框内容是否发生改变:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:

    @selector(textChange) name:UITextFieldTextDidChangeNotification object:self.accountField];

    当输入框内容发生改变会自动发送通知,之后会调用我们自定义的textChange方法。

    方法二:

    - (id)addObserverForName:(NSString *)name object:(id)obj queue:

    (NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;

    name:通知的名称

    obj:通知发布者

    queue:决定了block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行

    block:收到对应的通知时,会回调这个block

    例如:

    #import <Foundation/Foundation.h>

    #import "Person.h"

    #import "NewsCompany.h"

    int main(int argc, const char * argv[])

    {

        @autoreleasepool {

            // 1.初始化机构

            NewsCompany *tx = [[NewsCompany alloc] init];

            tx.name = @"腾讯新闻";

           

            NewsCompany *sina = [[NewsCompany alloc] init];

            sina.name = @"新浪新闻";

           

            // 2.初始化3个人

            Person *zhangsan = [[Person alloc] init];

            zhangsan.name = @"张三";

           

            Person *lisi = [[Person alloc] init];

            lisi.name = @"李四";

           

            Person *wangwu = [[Person alloc] init];

            wangwu.name = @"王五";

           

            NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

            // 3.添加监听器

            // zhangsan只监听tx发出的junshi_news_come通知

            // 2

            [center addObserver:zhangsan selector:@selector(newsCome:) name:@"junshi_news_come" object:nil];

            [center addObserver:zhangsan selector:@selector(newsCome:) name:@"yule_news_come" object:nil];

            // 1

            [center addObserver:lisi selector:@selector(newsCome:) name:nil object:tx];

            // 2

            [center addObserver:wangwu selector:@selector(newsCome:) name:nil object:nil];

           

            // 4.发布新闻

            // tx发布了一则叫做junshi_news_come的通知

            [center postNotificationName:@"junshi_news_come"

                                  object:tx

                                userInfo:@{@"title" : @"伊拉克战争停止了",

                                           @"intro" : @"伊拉克战争停止了.........."}];

           

            // sina发布了一则叫做junshi_news_come的通知

            [center postNotificationName:@"yule_news_come"

                                  object:sina

                                userInfo:@{@"title" : @"6456456456456",

                                           @"intro" : @"7657567567567"}];

        }

        return 0;

    }

    监听者在自己的方法中就可以获得这些信息:

    - (void)newsCome:(NSNotification *)note

    {

        // 通知的发布者

        NewsCompany *obj = note.object;

        NSLog(@"%@接收到了%@发出的通知,通知内容是:%@", self.name, obj.name, note.userInfo);

    }

    5、取消注册通知监听器

    通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃。

    通知中心提供了相应的方法来取消注册监听器

    (1)- (void)removeObserver:(id)observer;

    (2)- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

    一般在监听器销毁之前取消注册(如在监听器中加入下列代码):

    - (void)dealloc {

           //[super dealloc];  非ARC中需要调用此句

        [[NSNotificationCenter defaultCenter] removeObserver:self];

    }

  • 相关阅读:
    light oj 1105 规律
    light oj 1071 dp(吃金币升级版)
    light oj 1084 线性dp
    light oj 1079 01背包
    light oj 1068 数位dp
    light oj 1219 树上贪心
    light oj 1057 状压dp TSP
    light oj 1037 状压dp
    矩阵快速幂3 k*n铺方格
    矩阵快速幂2 3*n铺方格
  • 原文地址:https://www.cnblogs.com/lifengfneg/p/4773850.html
Copyright © 2011-2022 走看看