首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当观察值变为nil时,为什么观察者不发出事件?

当观察值变为nil时,观察者不发出事件的原因是观察者模式的设计决策。观察者模式是一种软件设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,它的所有依赖对象都会收到通知并自动更新。

在观察者模式中,观察者对象(也称为订阅者)通过订阅(注册)到被观察对象(也称为发布者)上,以便在被观察对象的状态发生变化时接收通知。当观察者订阅到被观察对象后,它会持有一个对被观察对象的引用,并通过回调函数或事件处理机制来接收通知。

然而,当观察值变为nil时,观察者不发出事件的原因可能是因为观察者模式的实现中,对于观察值为nil的情况进行了特殊处理或者忽略。这可能是为了避免在观察值为空时触发不必要的事件通知,或者是为了防止由于观察值为空而导致的异常或错误。

具体实现中的处理方式可能因编程语言、框架或库的不同而有所差异。在某些情况下,观察者模式的实现可能会在观察值为nil时抛出异常或错误,以提醒开发者进行修正或处理。在其他情况下,观察者模式的实现可能会忽略观察值为nil的情况,并继续正常地发送事件通知。

总之,为什么观察者不发出事件当观察值变为nil时,取决于具体的观察者模式的实现和设计决策。在实际开发中,开发者应该根据具体的需求和场景来选择适当的处理方式,并确保观察者模式的实现能够正确地处理各种可能的观察值情况。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RxJava2.x 五种观察者和操作符简介

RxJava 使用 3 步走: 创建 Observable; 创建 Observer; 使用 subscribe 进行订阅; 因此,这三者缺一不可,只有使用了 subscribe 被观察者才会开始发送数据...1.五种观察者模式描述表 类型 描述 Observable 能够发射 0或 n 个数据,并以成功或错误事件终止 Flowable 能够发射 0或 n 个数据,并以成功或错误事件终止,支持背压,可以控制数据源发射的速度...Single 只发射单个数据或错误事件 Completable 从来不发射数据,只处理 onComplete 和 onError 事件,可以看成 Rx 的Runnable Maybe 能够发射 0 或...doFinally 优先于 doAfterTerminate 的调用 doAfterTerminate 注册一个 Action, onComplete 或 onError 触发 1.Map Map...5.do do 操作符可以给 Observable 的生命周期的各个阶段加上一系列的回调监听,执行到这一阶段,回调就会被触发。

75220

编码篇-继承+通知看方法的实现和delloc方法的调用

有一个问题:为什么从 UITableViewCell B中POP后,UITableViewCell B没有被释放呢?...1.通知的观察者,或KVO的观察者 由于通知中心是系统的一个单例,你在注册通知的观察者,实际上是在通知中心注册的, 这时,即使ARC下系统帮我们释放了对象,但是在通知中心的观察还是没有移除,那么有...C语言写的一些好内存的类文件, 4.控制器中NSTimer没有被销毁 viewController中存在NSTimer,需要特别注意,调用[NSTimer scheduledTimerWithTimeInterval...:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES],因为 target:self ,也就是引用了当前viewController...#最后一个参数是表示会对哪个发送者对象发出的事件作出响应,nil 表示接受所有发送者的事件

81220
  • 浅谈 iOS NSNotification

    在 NSNotificationCenter 注册观察者,发送者使用通知中心广播,以 NSNotification 的 name 和 object 来确定需要发送给哪个观察者。...监听同一条通知的多个观察者,在通知到达,它们执行回调的顺序是不确定的,所以我们不能去假设操作的执行会按照添加观察者的顺序来执行。...其实,从 iOS 9 开始,即使不移除观察者对象,程序也不会出现异常。这是为什么呢?我们先了解一下,为什么 iOS 9 之前需要手动移除观察者对象。...在 MRC 时代,观察者注册,通知中心并不会对观察者对象做 retain 操作,而是对观察者对象进行 unsafe_unretained 引用。...我们仍然是像之前一样去注册一个通知的观察者 Notification 到达,先看看 post 这个 Notification 的线程是不是我们所期望的线程,如果不是,就将这个 Notification

    1.3K30

    LiveData详细分析

    LiveData需要一个观察者对象,一般是Observer类的具体实现。观察者的生命周期处于STARTED或RESUMED状态,LiveData会通知观察者数据变化。...自动解除数据订阅 要想使用LiveData(或者这种有可被观察数据能力的类)就必须配合实现了LifecycleOwner的对象使用。在这种情况下,对应的生命周期对象DESTORY,才能移除观察者。...不会发生内存泄露 观察者被绑定到组件的生命周期上,被绑定的组件销毁(onDestroy)观察者会立刻自动清理自身的数据。...f.为什么观察者只能与一个LifecycleOwner绑定,而不是多个?...对于onActive方法,活动观察者的数量从0变为1调用;对于onInactive方法,活动观察者的数量从1变为0调用if (wasInactive && mActive) { onActive

    2.9K00

    # iOS中的KVO底层实现

    观察者模式就是 目标对象(被观察的对象)管理所有依赖于它的观察者对象,并在它自身的状态改变主动通知观察者对象。而主动通知观察者对象这个实现一般都是调用观察者对象提供的接口。...这样就可以将目标对象和观察者对象松散偶合。 iOS 中的实现就更简单了,利用respondsToSelector来判断观察者是否实现了指定的方法,就可以通知观察者对象了。...原理:第一次观察某个类的实例对象,会动态创建一个该类的子类,然后将该对象的isa修改为这个新的子类的Class,重写被观察的属性的 set方法,然后在修改属性前后,调用观察者的接口来通知观察者。...都是为NSObjet增加了几个Category,分别放了KVO要实现的键值观察方法和添加观察者、移除观察者等API方法。...2.如果kvo设置的options中包含initial,需要将初始化的返回给观察者

    1.2K30

    iOS的MVC框架之模型层的构建

    Delegate和block方式虽然都是一种观察者实现,但却不是标准和经典的观察者模式。因为这两种模式是无法实现多观察者的。...也就是说数据更新而进行通知,只能有一个观察者进行监听和处理,不能实现多个观察者的通知更新处理。 那么如果我们需要实现变化时让多个观察者都能接收并处理呢?...这样只要进入某个需要监听的页面就通过KVO的方式来监听这个属性,而退出页面则取消监听。从而可以完全实现了多观察者这种方式了,这种方式将不再需要定义和实现delegate协议了。...既然通知这种机制那么好,那么为什么不主动推荐呢?答案是这种机制太过于松散了。虽然他解决了多观察者的问题,但是过于松散的结果是给使用者带来了一定的学习成本。...@implementation VC -(void) viewWillAppear:(BOOL)animated { //这里必须要预先添加一些观察者来处理一些不知道上下文的事件

    91220

    RxSwift-Subject即攻也守

    在掌握前面序列以还有观察者的前提下,我们今天来看一个非常特殊的类型-Subject.为什么说它特殊呢?原因很简单:Subject既可以做序列,也可以做观察者!...public protocol SubjectType : ObservableType { // 关联了观察者类型,具备这个类型的能力 associatedtype SubjectObserverType...ObserverType func asObserver() -> SubjectObserverType } SubjectType首先就是继承了ObservableType,具有序列特性 关联了观察者类型...,订阅者订阅BehaviorSubject,会收到订阅后Subject上一个发出的Event,如果还没有收到任何数据,会发出一个默认。..._lastElement当成事件传出去,响应.next(lastElement) 如果没有保存事件就发送完成事件:.completed error事件会移空整个响应集合:self.

    47910

    ios KVO及实现原理

    概述 KVO全称KeyValueObserving,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变接收到事件。...KVO和NSNotificationCenter都是iOS中观察者模式的一种实现。区别在于,相对于被观察者观察者之间的关系,KVO是一对一的,而不一对多的。...| NSKeyValueObservingOptionOld context:nil]; 2.在观察者中实现以下回调方法 - (void)observeValueForKeyPath:(NSString...NSDictionary *)change context:(void *)context { NSLog(@"%@",change); } 3.观察者不需要监听...:被调用,通知系统该 keyPath 的属性即将变更;改变发生后, didChangeValueForKey: 被调用,通知系统该 keyPath 的属性已经变更;之后, observeValueForKey

    67520

    RunLoop数据结构、RunLoop的实现机制、RunLoop的Mode、RunLoop与NSTimer和线程

    1、没有消息处理,休眠已避免资源占用,由用户态切换到内核态(CPU-内核态和用户态) 2、有消息需要处理,立刻被唤醒,由内核态切换到用户态 为什么main函数不会退出?...2、通知观察者即将要处理Timer事件。 3、通知观察者即将要处理source0事件。 4、处理source0事件。 5、如果基于端口的源(Source1)准备好并处于等待状态,进入步骤9。...6、通知观察者线程即将进入休眠状态。 7、将线程置于休眠状态,由用户态切换到内核态,直到下面的任一事件发生才唤醒线程。 一个基于 port 的Source1 的事件(图里应该是source0)。...8、通知观察者线程将被唤醒。 9、处理唤醒收到的事件。 如果用户定义的定时器启动,处理定时器事件并重启RunLoop。进入步骤2。 如果输入源启动,传递相应的消息。...进入步骤2 10、通知观察者RunLoop结束。 五、RunLoop与NSTimer 一个比较常见的问题:滑动tableView,定时器还会生效吗?

    63240

    iOS面试题:RunLoop剖析

    1、没有消息处理,休眠已避免资源占用,由用户态切换到内核态(CPU-内核态和用户态) 2、有消息需要处理,立刻被唤醒,由内核态切换到用户态 为什么main函数不会退出?...2、通知观察者即将要处理Timer事件。 3、通知观察者即将要处理source0事件。 4、处理source0事件。 5、如果基于端口的源(Source1)准备好并处于等待状态,进入步骤9。...6、通知观察者线程即将进入休眠状态。 7、将线程置于休眠状态,由用户态切换到内核态,直到下面的任一事件发生才唤醒线程。 一个基于 port 的Source1 的事件(图里应该是source0)。...8、通知观察者线程将被唤醒。 9、处理唤醒收到的事件。 如果用户定义的定时器启动,处理定时器事件并重启RunLoop。进入步骤2。 如果输入源启动,传递相应的消息。...进入步骤2 10、通知观察者RunLoop结束。 五、RunLoop与NSTimer 一个比较常见的问题:滑动tableView,定时器还会生效吗?

    84320

    iOS NSNotificationCenter通知中心的实现原理

    NSNotificatinonCenter用来管理通知,将观察者注册到NSNotificatinonCenter的通知调度表中,然后发送通知利用标识符name和object识别出调度表中的观察者,然后调用相应的观察者的方法...,字典用来存储发送通知附带的信息,也可以为nil。...在通知中心注册观察者,发送者使用通知中心广播,以NSNotification的name和object来确定需要发送给哪个观察者。...发送通知通过name和object来确定来标识观察者,name和object两个参数的规则相同即通知设置name为kChangeNotifition,那么只会发送给符合name为kChangeNotifition...anObject发送名字为notificationName的notification, 将会调用anObserver的aSelector方法 移除观察者 在对象被释放前需要移除掉观察者,避免已经被释放的对象还接收到通知导致崩溃

    2.3K30

    走进 RxSwift 之冷暖自知

    关于标题 言归正传啊,今天还是想跟大家聊一聊 RxSwift ,之前我写过一篇 走进 RxSwift 之观察者模式,讲解了 RxSwift 的部分实现。...key) } 这段代码看着复杂,但它的核心其实就一句: let key = _observers.insert(observer.asObserver()) 也就是把当前的订阅者加到一个订阅者集合中,而有新的事件...由上可得,HO 其实是比较典型的观察者模式,跟 target-action 啊 NSNotificationCenter 啊等等的实现原理是差不多的,都需要维护一个观察者集合。...所以 UIKit 已经有在维护一个观察者集合了,本身已经是“热”的了,Rx 就没必要再去加把火了。...当然也可以使用shareReplayLatestWhileConnected,它返回一个ShareReplay1WhileConnected实例,与ShareReplay1不同的是,订阅者从 1 变为

    2.4K10

    用Swift写一个响应式编程库

    如果你对观察者模式很熟悉的话,那么响应式编程就很容易理解了。 响应式编程是一种面向数据流和变化传播的编程范式。...比如用户输入、单击事件、变量值等都可以看做一个流,你可以观察这个流,并基于这个流做一些操作。“监听”流的行为叫做订阅。响应式就是基于这种想法。 废话不多说,撸起袖子开干。...在响应式里面,我们监听请求,请求完成观察者得到更新。...不过这里还存在很多问题,比如我们应该在适当的时机移除观察者,现在我们的观察者被添加在 subscribers 数组中,这样就不知道该移除哪一个观察者,所以我们将数字替换成字典,用 UUID 作为 key...} } 这样我们只要在适当的时机销毁 Disposable 就可以移除观察者了。

    88670

    用Swift写一个响应式编程库

    如果你对观察者模式很熟悉的话,那么响应式编程就很容易理解了。 响应式编程是一种面向数据流和变化传播的编程范式。...比如用户输入、单击事件、变量值等都可以看做一个流,你可以观察这个流,并基于这个流做一些操作。“监听”流的行为叫做订阅。响应式就是基于这种想法。 废话不多说,撸起袖子开干。...在响应式里面,我们监听请求,请求完成观察者得到更新。...不过这里还存在很多问题,比如我们应该在适当的时机移除观察者,现在我们的观察者被添加在 subscribers 数组中,这样就不知道该移除哪一个观察者,所以我们将数字替换成字典,用 UUID 作为 key...} } 这样我们只要在适当的时机销毁 Disposable 就可以移除观察者了。

    1.1K50

    iOS代理,通知,block的用法及不同

    我们需要在通知中心注册我们想要监听的消息,项目中有地方发出这个消息的时候,通知中心会发送给注册这个消息的对象。 2....使用步骤 //创建通知及观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getFinishOfInfo...接受通知,对象是NSNotification。 (2).创建了观察者,在dealloc里面一定要移除。 4. 使用场景 (1).很多控制器都需要知道一个事件,应该用通知....3 . block栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗。...这也是为什么现在苹果 API 中越来越多地使用 Blocks 而不是代理。 在APP中,很多控制器都需要知道一个事件,应该用通知;

    1.8K30

    iOS 开发:『Crash 防护系统』(二)KVO 防护

    KVO 允许一个对象监听另一个对象特定属性的改变,并在改变接收到事件。但是 KVO API 的设计,我个人觉得不是很合理。被观察者需要做的工作太多,日常使用时稍不注意就会导致崩溃。...重复添加多次,虽然不会崩溃,但是发生改变,也同时会被观察多次。 被观察者提前被释放,被观察者在 dealloc 仍然注册着 KVO,导致崩溃。...KVODelegate 对象,而观察者的特定属性发生了改变,再由 KVODelegate 对象 分发到原有的观察者上。...添加观察者:通过关系哈希表判断是否重复添加,只添加一次。 移除观察者:通过关系哈希表是否已经进行过移除操作,避免多次移除。...观察键值改变:同样通过关系哈希表判断,将改变操作分发到原有的观察者上。 另外,为了避免被观察者提前被释放,被观察者在 dealloc 仍然注册着 KVO 导致崩溃。

    4.3K41

    “终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!

    走到onStart()变为活跃,onChanged被调用,但value被onStart()中setValue的value覆盖,所以打印的是onChanged: onStart。...onActive()调用时机为:活跃的观察者(LifecycleOwner)数量从 0 变为 1 。...onInactive()调用时机为:活跃的观察者(LifecycleOwner)数量从 1 变为 0 。...* 观察者只在LifecycleOwner活跃接受事件,如果变为DESTROYED状态,observer自动移除。 * 数据在非活跃更新,observer不会接收到。...到这里观察者模式完整的实现逻辑就梳理清晰了:LivaData通过observe()添加 与LifecycleOwner绑定的观察者观察者变为活跃回调最新的数据;使用setValue()、postValue

    4K30

    设计模式中学习golang高级特性(二)

    今天要介绍的是设计模式中的观察模式,也就是订阅发布模式,它实现方式有两种,一种是不考虑任何通用性、复用性的简易实现版本,另一种是event bus事件总线框架实现的版本,这两种模式用到的Go特性如下:make...观察者模式observerGo特性关键词:make与切片,for与range,可变参数......(三个点)观察者模式另一个名字订阅发布模式大家一定非常熟悉,比如说最近新款iPhone上线了,由于非常火爆肯定会有小伙伴们遇到没货的情况,那么这个时候电商一般会有一个订阅模式,比如说来货了会通知你,那么这个就是观察者模式...实现起来也比较简单,可以想象到电商平台一定要维护一个观察者的链表,来货的时候会遍历链表通知用户,每个用户都会有一个通知后的hook函数。..., 0))}}第二,多用户是可以同时订阅一个事件的,这就意味着我们用链表存取用户通知的回调函数,会有一个并发的考虑,那么我们改动这个链表的就需要加锁,处理完成后需要解锁,如果忘记解锁会直接BBQ,

    11310

    设计模式--观察者模式的思考

    为什么可以这样? 因为Observer之间没有任何关系,只是单纯的做自己要做的事情,也并不需要返回之类的东西....,每一个都是独立的处理 观察者模式设计 上述用观察模式可以设计如下结构: ?...观察者的 “感兴趣” 粒度 在观察者模式中Observer会像Subject注册自己,那么Subject对应多个事件怎么处理呢?...1.Subject管理多组Observer 在Subject中存放着多组Observer,一个事件触发只会通知其中一组.这样做法个人感觉是比较合理的.缺点是管理不方便,对于Subject来说要管理多组...,接收到消息需要用instance判断是否是自己感兴趣的事件,然后才执行逻辑,当事件很少的话这种方式是比较合适的,事件多的话则对一堆事件要分开处理,依然很麻烦.Eclipse的SWT是这种设计.

    52420

    Carson带你学Android:图文详解RxJava背压策略

    ()减到0,则代表观察者已经不可接收事件 此时被观察者若继续发送事件,则会抛出MissingBackpressureException异常 如观察者可接收事件数量 = 1,观察者发送第2个事件...> 接收事件 速度,即流速不匹配 具体表现是:出现缓存区大小存满(默认缓存区大小 = 128)、被观察者仍然继续发送下1个事件 处理方式:友好提示:缓存区满了 // 创建被观察者Flowable...> 接收事件 速度,即流速不匹配 具体表现是:出现缓存区大小存满(默认缓存区大小 = 128)、被观察者仍然继续发送下1个事件 处理方式:将缓存区大小设置成无限大 即 被观察者可无限发送事件 观察者...} }); 被观察者一下子发送了150个事件,点击按钮接收观察者接收了128个事件;再次点击接收却无法接受事件,这说明超过缓存区大小的事件被丢弃了。...} }); 被观察者一下子发送了150个事件,点击按钮接收观察者接收了128个事件; 再次点击接收却接收到1个事件(第150个事件),这说明超过缓存区大小的事件仅保留最后的事件

    1.2K10
    领券