精华内容
下载资源
问答
  • iOS 观察者+通知

    2015-12-06 21:44:34
    注册观察者 发送通知 接收通知

    NSNotificationCenter、NSNotification


    通知机制(广播电台)

    就像我们现在的电台一样,比如说dj子劲的电台,他那里就是一个广播中心,负责发送通知(今天的广播内容),我们如果安装了网易云客户端,并且收听了他的电台(就相当于添加了一个观察者,这个观察者就是我们自己的手机),当电台那发送一条消息后,我们就可以接收到,并可以进行一系列操作,比如你喜欢的话,会选择分享吧,或者私信一下聊聊心情,或者置之不理也可以。
    所以,我们首先得注册一个观察者来监听广播中心是否有新消息。
    

    第一步 需要做的就是 在需要接收 通知的 地方 注册一个观察者。

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(you:) name:@"notification" object:nil];
     并且,实现接收到通知后应该要做的操作。
     -(void)you:(NSNotification *)notification{
    
    NSLog(@" --- %@",notification.userInfo);
    }
    

    第二步 需要做的就是 在需要传播一个消息的地方 post一个通知。

    [[NSNotificationCenter defaultCenter] postNotificationName:@"notification" object:nil userInfo:@{@"hi":@"long time no see"}];
    

    所以,总的来说,通知机制是有先后顺序的。

    你要想接收到这个通知,就必须先注册一个观察者,来检测这个通知中心的消息。
    只要通知中心发布了一个消息之后呢,你就能接收这条消息,并作出反馈。
    
    展开全文
  • 通知 NSNotification ...通知:一种发送给一个或者多个观察者,用来通知其在程序中发生了某个事件的消息。Cocoa中的通知机制遵循的是一种广播模式。它是一种程序中事件的发起者或者是处理者和其它想要知道该

    通知 NSNotification
    OC中的KVO是一种简单的观察者设计模式,涉及到两个对象,分别是观察者和被观察者。这种方式实质有很大的局限性。OC的Foundation框架为开发者提供了新的一种观察者设计模式,即通知。
    通知:一种发送给一个或者多个观察者,用来通知其在程序中发生了某个事件的消息。Cocoa中的通知机制遵循的是一种广播模式。它是一种程序中事件的发起者或者是处理者和其它想要知道该事件的对象沟通的一种方式。消息的接收者,也就是观察者响应该事件来改变自己的UI、行为或者状态。
    初始化一个通知(NSNotification)的实例对象:

    NSNotification *notification1 = [NSNotification notificationWithName:@"nontification_One" object:self];
    //或者
    NSNotification *notification2 = [NSNotification notificationWithName:@"nontification_Two" object:self userInfo:@{@"content":@"Hello world!"}];

    其中name表示的是通知名称,object表示通知发起人(对象),userInfo:表示通知内容


    创建通知中心(NSNotificationCenter)对象

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    建立通知发送机制:

    //.m实现文件(观察者类中实现)
    //重写初始化方法
    -(id)init{
        if(self = [super init])
        {   //1.注册监听者
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction:) name:@"WeatherAndPhoneUser" object:nil];
        }
        return self;
    }

    其中addObserver是添加监听者,selector是选择回调方法,name是通知名称,Object表示通知的目标。

    //回调方法
    -(void)notificationAction:(NSNotification *)notification{
        NSDictionary *dic = notification.userInfo;
        NSL(@"%@",dic);
    }
    //移除监听者
    -(void)dealloc{
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    //通知发送(一般在被观察者类中实现)
    -(void)sendMessage{
        [NSNotificationCenter default]postNotificationName:"WeatherAndPhoneUser" object:self userInfo:@{@"":@""}];
    }

    运行结果:
    这里写图片描述

    展开全文
  • 一、通知中心是一种机制,是观察者设计模式的一种实现。 观察者,是一个对被观察者的状态变化需要做出反应的对象,所以观察者需要被观察者状态变化的信息 被观察者一旦发生变化,需要通知所有被观察者。如果不是...

    一、通知中心是一种机制,是观察者设计模式的一种具体实现。KVO是观察者模式的另一种具体实现

    观察者模式的解释:

    观察者,是一个对被观察者的状态变化需要做出反应的对象,所以观察者需要被观察者状态变化的信息,观察者订阅被观察者的内容,即注册。

    被观察者一旦发生变化,需要通知所有被观察者。如果不是观察者,则不需要信息,也不会被通知。


    二、关于postNotificationName:object:userinfo:函数的一点说明

    object是notificationSender,即谁发送了这个通知。但是实际编写代码中,也可以传一个需要当数据参数的对象,灵活运用。如果接受者不需要,也可以是nil


    展开全文
  • 观察者模式-通知详解

    2018-08-22 15:31:17
    在这种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 观察者模式的类图如下:  ...

    观察者模式也叫发布/订阅模式,是软件设计模式中的一种。在这种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

    观察者模式的类图如下:

                                      

                                                                                                        观察者模式类图

    可以看出它有四个角色,具体如下:

    抽象主题(Subject):抽象主题是一个协议,它是一个观察者的集合容器,定义添加观察者(attach)方法,移除观察者(detach)方法和所有观察者发送通知的方法(notifyObserve)。

    抽象观察者(Observe):抽象观察者也是一个协议,它有一个更新(update)方法。

    具体观察者(ConcreteObserve):观察协议具体实现。

    具体主题(ConcerteSubject):主题协议的具体实现。

    从图中可以看出,引入观察和主题这两个协议后,观察者模式可以完美的将观察者和被观察的对象分离开,不仅提高了系统的可复用行,还降低了耦合度。

    在Cocoa Touch框架中,观察者模式的具体应用有两个 - 通知(notification)机制和KVO(Key-ValueObserving)机制。

    通知机制

    通知机制与委托机制不同的是,前者是“一对多”的对象之间的通信,后者是“一对一”的对象之间的通信。

    在通知机制中对某个通知感兴趣的所有对象可以成为接收者首先,对这些对象需要向通知中心(NSNotificationCenter)发出addObserve:选择器:名称:对象消息进行注册,在投送对象投送通知给通知中新世,通知中心就会把通知广播给注册过的接收者。所有的接收者都不知道是谁投送的,更不关心细节。投送对象与接收者是一对多的关系。接收者如果对通知不再关注,会给通知中心发出removeObserver:名称:对象:消息解除注册,以后不再接收通知。

                             

                                                                                 通知机制

    注册通知:

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(resignNotification:) name:@"login" object:nil];
    
        /** 换种方式 */
        __weak typeof(self) weakSelf = self;
        [[NSNotificationCenter defaultCenter]addObserverForName:@"drain" object:nil queue:[NSOperationQueue new] usingBlock:^(NSNotification * _Nonnull note) {
            NSLog(@"你瞅啥");
            NSLog(@"接收到通知:%@",[NSThread currentThread]);
        }];
    }
    
    -(void)resignNotification:(NSNotification *)notification{
        NSLog(@"%s",__func__);
        NSLog(@"接收到通知:%@",[NSThread currentThread]);
    }

    发送同步通知:

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
         [[NSNotificationCenter defaultCenter]postNotificationName:@"login" object:nil userInfo:@{}];
    
    }

    发送异步通知:

    /**
     * NSPostingStyle有三种:
     NSPostNow:与postNotificationName相同(就是在哪个线程里面就是获取当前线程的通知队列并且默认采用NSPostNow发送时机)
     NSPostASAP:不立即发出通知,而是在runloop匹配时调用,即:runloop处理事件源时
     NSPostWhenIdle:runloop闲置的时候post,即:runloop进入睡眠时
     */
    /*
     NSNotificationCoalescing消息合并的方式
     NSNotificationNoCoalescing = 0, //不合并
     NSNotificationCoalescingOnName = 1,//按名称合并
     NSNotificationCoalescingOnSender = 2,//按发送者合并
     */
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        //每个线程都默认又一个通知队列,可以直接获取,也可以alloc
        NSNotificationQueue *notificationQueue = [NSNotificationQueue defaultQueue];
        NSNotification *notification = [NSNotification notificationWithName:@"drain" object:nil];
        NSNotification * notificationtwo = [NSNotification notificationWithName:@"drain" object:nil];
    
        NSLog(@"发送通知before:%@",[NSThread currentThread]);
        [notificationQueue enqueueNotification:notification postingStyle:NSPostNow coalesceMask:NSNotificationNoCoalescing forModes:nil];
        [notificationQueue enqueueNotification:notificationtwo postingStyle:NSPostWhenIdle coalesceMask:NSNotificationCoalescingOnName forModes:nil];
        [notificationQueue enqueueNotification:notification postingStyle:NSPostWhenIdle coalesceMask:NSNotificationCoalescingOnName forModes:nil];
        NSLog(@"发送通知After:%@",[NSThread currentThread]);
    }

    移除通知:

    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"login" object:nil];
    //<# #>就是<## >

    输出结果:

    2018-08-22 15:20:53.382286+0800 AngelClient[4074:168069] -[ViewController resignNotification:]
    2018-08-22 15:20:53.382421+0800 AngelClient[4074:168069] 接收到通知:<NSThread: 0x60c0000788c0>{number = 1, name = main}
    2018-08-22 15:20:53.382513+0800 AngelClient[4074:168069] 发送通知before:<NSThread: 0x60c0000788c0>{number = 1, name = main}
    2018-08-22 15:20:53.382889+0800 AngelClient[4074:168112] 你瞅啥
    2018-08-22 15:20:53.383015+0800 AngelClient[4074:168112] 接收到通知:<NSThread: 0x604000267dc0>{number = 3, name = (null)}
    2018-08-22 15:20:53.383172+0800 AngelClient[4074:168069] 发送通知After:<NSThread: 0x60c0000788c0>{number = 1, name = main}
    2018-08-22 15:20:53.383594+0800 AngelClient[4074:168112] 你瞅啥
    2018-08-22 15:20:53.383741+0800 AngelClient[4074:168112] 接收到通知:<NSThread: 0x604000267dc0>{number = 3, name = (null)}

    NSNotificationCenter是单例模式,创建获得共享实例的方法defaultCenter。其中名称是通知的名字,对象是投送通知时传递过来的对象(不一定是self对象,如果接收者不需要,可以将其设为nil),USERINFO是投送通知时定义的字典对象,可以用于参数的传递,进行的是同步发送.NSNotificationQueue是将发送的通知加到当前线程的队列中,进行异步发送。

    下一篇:观察者模式-KVO详解

    展开全文
  • java 子线程通过观察者模式通知主线程
  • 观察者模式

    千次阅读 2019-02-17 23:00:05
    关键点:  1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。  2、重点就在被观察者的实现中: ... 3、观察者中需要有个接收被观察者通知的方法。 1.抽象主题角色,watched被观察 ...
  • 当一个通知有多个观察者通知发生时,观察者的执行顺序是什么,是随机的吗, 如果是,有什么办法使他们按一定的顺序去执行?
  • 观察者模式 - 通知/KVO

    2015-12-21 22:31:48
    观察者模式是一种常用的设计模式,一个对象A想了解另一个对象B的状态是否发生了改变,把A注册成为B的观察者,当B发生改变时,通知A,告知B的变化 观察者模式的实现方式主要有两种: 通知,KVO(KVC/KVO) ...
  • 观察者模式也只是在使用通知中心的时刻才能用到,难道是观察者模式比不上代理模式?虽然说,观察者模式在效率上不如代理模式,但是使用观察者模式可以实现程序的解耦,并且在层次结构比较深的地方,使用观察者也比...
  • 观察者模式也只是在使用通知中心的时刻才能用到,难道是观察者模式比不上代理模式?虽然说,观察者模式在效率上不如代理模式,但是使用观察者模式可以实现程序的解耦,并且在层次结构比较深的地方,使用观察者也比...
  • 观察者模式、事件通知、消息... 观察者模式:被观察对象状态改变,所有观察它的对象得到通知。也称订阅模式,英文Observer。 被观察者不依赖观察者,通过依赖注入达到控制反转。 事件通知:事件发生后,通知所有关...
  • 观察者模式和事件通知备忘 MessageBus.instance().post(Notify.PARKIN, in,bytes); 这种是仿照Android的EventBus,用new的一个实例对象根据path反射调用其中的方法处理逻辑 要修改为 rest形式,根据path指定类的...
  • JAVA观察者模式

    2016-12-17 13:38:31
    观察者模式属于一对多的关系,简单来说就是被观察者通知观察者。以下简单记录java观察者模式的实现。/** * 观察者 */ public interface Watcher { public void goHome(); }/** *被观察者 */ public interface ...
  • OC 观察者模式(通知中心,KVO) 什么是观察者模式??? A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化。这就是观察者模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时...
  • iOS通知观察者的添加和移除

    千次阅读 2016-12-12 16:10:25
    一种是在-view didload中注册通知观察者对应的我们需要在在dealloc中移除通知。因为didload只在view controller生成时执行一次,dealloc也是view controller销毁时才执行,这样对应保证我们不会多次注册通知或者多次...
  • 观察者模式定义了一种一对多的依赖关系, 让多个观察者对象可以同时监听某一主题对象, 当这个主题对象的状态发生改变的时候, 就会通知所有的观察者对象, 使他们可以自动更新自己。 subject 类, 一般称为主题类...
  • 观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 举个简单的例子:你和你的舍友都订阅了同一个公众号,你和舍友就是观察者,而这个...
  • 一、内容提供的作用 1. 应用成需创建的数据库文件,默认都是私有的,其他应用程序不具备读写权限 2. 如果真的想把自己的数据库数据暴露给其他程序访问,那么就应该通过内容提供来暴露。 3. 与aidl有点类似,...
  • 通知机制与KVO的不同之处在于,前者是一个中心对象为所有观察者提供变更通知,后者是被观察对象直接向观察者发送通知。 以下关注观察者模式与通知机制实现: 1、观察者模式中Subject对象,又可称目标对象,是通知...
  • Java JDK 观察者模式

    2018-03-19 09:10:27
    subject -&gt; java.util.Observable(类)void addObserver(Observer o) 如果观察者与集合中已有的观察者不同,则向对象的观察者... 指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasCh...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,778
精华内容 5,111
关键字:

观察者通知