LifecycleHandler(LifecycleOwner lifecycleOwner) { mLifecycleOwner = lifecycleOwner; addObserver (); } private void addObserver() { if (mLifecycleOwner ! = null) { mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAstrong textdapter owner) { removeCallbacksAndMessages(null); } } 我们来看一下这一行代码 mLifecycleOwner.getLifecycle().addObserver 以后想观察 lifecycle 生命周期变化的话,只需要 mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter
观察者模式又称为发布/订阅(Publish/Subscribe)模式 观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer) (1)Subject模块 Subjec模块有3个主要操作 addObserver www.processon.com在线画的UML图 2、简单样例 (1)主题接口 package observer; public interface Subject { //添加观察者 void addObserver observers=new ArrayList<Observer>(); //期刊版本 private int version; @Override public void addObserver "B"); CustomerObserver c = new CustomerObserver("C"); //将观察者注册到主题中 magazine.addObserver (a); magazine.addObserver(b); magazine.addObserver(c); //更新主题的数据,当数据更新后,会自动通知所有已注册的观察者
总效果.gif 主要代码如下: //监测屏幕旋转 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector self.avPlayer.currentItem]; //添加AVPlayerItem开始缓冲通知 [[NSNotificationCenter defaultCenter] addObserver )object change:(NSDictionary *)change context:(void *)context; //监控播放速率 [self.avPlayer addObserver NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; //监控网络加载缓冲情况属性 [playerItem addObserver "loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil]; //监控是否可播放 [playerItem addObserver
interface Observable { void addObserver(Observer observer); void removeObserver(Observer observer (xiaoHong); xiaoMing.addObserver(xiaoDong); xiaoMing.sendMessage("今天真开心"); // (xiaoHong2); xiaoMing2.addObserver(xiaoDong2); xiaoMing2.sendMessage("今天真开心"); (xiaoMing2); xiaoHong2.addObserver(xiaoDong2); xiaoHong2.sendMessage("今天和小明吵架了,屏蔽他的朋友圈 "); xiaoDong2.addObserver(xiaoMing2); xiaoDong2.addObserver(xiaoHong2); xiaoDong2
id)object userInfo:(NSDictionary *)userInfo; 6、注册通知监听器: 通知中心提供了方法类注册一个坚挺通知的监听器(Observer): - (void)addObserver ; NSString *notice2 = @"亚投行"; //步骤1、先注册通知的监听者 /* - (void)addObserver :per1 selector:@selector(MonitorMessage:) name:nil object:nil]; [center addObserver:per2 selector :@selector(MonitorMessage:) name:notice1 object:nil]; [center addObserver:per3 selector:@selector (MonitorMessage:) name:nil object:com1]; [center addObserver:per4 selector:@selector(MonitorMessage
如果需要,具体观察者角色可以保有一个指向具体主题角色的引用,通常用一个子类实现 代码示例 抽象主题角色 public interface AbstractSubject { public void addObserver List<AbstractObserver> list = new ArrayList<AbstractObserver>(); @Override public void addObserver subject = new ConcreteSubject(); //为主题角色增加观察者对象,这里采用匿名内部类的方式,与AWT编程里的安装监听器类似 subject.addObserver update() { System.out.println("A同学您的APP需要更新"); } }); subject.addObserver (watcher1); watched.addObserver(watcher2); watched.count(10); } } 复制代码 总结 被观察者要继承
废话不多说直接上代码(此demo仅帮助理解发布/订阅模式): let Observable = { observers:[], // 订阅者集合 addObserver:function } function observer3(message){ console.log(`3---------${message}`); } // 添加订阅者 Observable.addObserver (observer1); Observable.addObserver(observer2); Observable.addObserver(observer3); // 向订阅者发布(通知)消息 Observable.notifyObservers
ConcreteSubject(具体主题) Observer(观察者) ConcreteObserver(具体观察者) 类图 示例代码 public interface Subject { void addObserver this.condition = condition; notifyObservers(); } @Override public void addObserver Observer weatherConditionDisplay = new WeatherConditionDisplay(); // 注册观察者 weatherStation.addObserver (temperatureDisplay); weatherStation.addObserver(weatherConditionDisplay); // 模拟天气数据更新
简单示例 定义观察目标接口(Subject)和观察者接口(Observer)// ObserverPattern.ts // 观察目标接口 interface Subject { addObserver (Leo); subject.addObserver(Robin); subject.addObserver(Pual); subject.addObserver(Lisa); subject.notifyObservers subject.notifyObservers(); } useObserver(); 完整演示代码如下: // ObserverPattern.ts interface Subject { addObserver void; } class ConcreteSubject implements Subject{ private observers: Observer[] = []; public addObserver (Leo); subject.addObserver(Robin); subject.addObserver(Pual); subject.addObserver(Lisa); subject.notifyObservers
简单示例 定义「观察目标接口」(Subject)和「观察者接口」(Observer) // ObserverPattern.ts // 观察目标接口 interface Subject { addObserver const Pual = new ConcreteObserver("Pual"); const Lisa = new ConcreteObserver("Lisa"); subject.addObserver (Leo); subject.addObserver(Robin); subject.addObserver(Pual); subject.addObserver(Lisa); subject.notifyObservers void; } class ConcreteSubject implements Subject{ private observers: Observer[] = []; public addObserver (Leo); subject.addObserver(Robin); subject.addObserver(Pual); subject.addObserver(Lisa); subject.notifyObservers
MRCObject - (id)init { if (self = [super init]) { [[NSNotificationCenter defaultCenter] addObserver 这点就可以证明,addObserver后,必须要有remove操作。 - (void)viewDidLoad { [superviewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver: viewWillAppear:(BOOL)animated { [super viewWillAppear: animated]; [[NSNotificationCenter defaultCenter] addObserver 你这边可要注意了,一定要成双成对出现,如果你只在viewWillAppear 中 addObserver没有在viewWillDisappear 中 removeObserver那么当消息发生的时候,你的方法会被调用多次
被观察者 到时候也好通知观察者 * Interface Observable */ interface Observable { // 添加观察者 public function addObserver function update() { echo '李四 有你的通知来了 快快行动'; } } //$pork = new Pork(); // //$pork->addObserver (new Aoppp()); //$pork->addObserver(new Lisi()); //$pork->setPrice(100); /** * 这个时候你发现 可以随便通知任何人, */ class ObserverUtil implements Observable { public $observableList; public function addObserver (new Aoppp()); $pork->addObserver(new Lisi()); $pork->setPrice(100); // 这样的话 你要监听鸡肉 还是什么乱七八糟的 都要方便很多了
[activityIndicatorView stopAnimating]; } [notificationCenter addObserver af_startAnimating) name:AFNetworkingTaskDidResumeNotification object:task]; [notificationCenter addObserver af_stopAnimating) name:AFNetworkingTaskDidCompleteNotification object:task]; [notificationCenter addObserver stopAnimating]; } // 添加任务的开始暂停完成的通知 [notificationCenter addObserver af_startAnimating) name:AFNetworkingTaskDidResumeNotification object:task]; [notificationCenter addObserver
KVO 的初探 进行探索之前, 首先看看 KVO 是怎么使用的: // 方法 - (void)addObserver:(NSObject *)observer forKeyPath NSKeyValueObservingOptions)options context:(nullable void *)context; // 日常使用 [self.person addObserver 1. context 是什么 首先来看看官方文档里关于 context 的相关介绍: The context pointer in the addObserver:forKeyPath:options ensure notifications you receive are destined for your observer and not a superclass. // 大概意思是 // addObserver property (nonatomic, copy) NSString *name; + (instancetype)shareInstance; @end // 控制器 A [self.person addObserver
Subject(抽象主题): public interface ISubject{ public void addObserver(Observer observer); public private Vector<Observer> observers = new Vector<>(); //增加一个观察者 @Override public void addObserver subject2"); Observer observer3=new ConcrereObserver("subject3"); //添加观察者 subject.addObserver (observer1); subject.addObserver(observer2); subject.addObserver(observer3); > obs; public Observable() { obs = new Vector<>(); } public synchronized void addObserver
MyEvent(vtk.vtkInteractorStyleTrackballCamera): def __init__(self, parent=None): self.AddObserver ("MiddleButtonPressEvent", self.middle_button_press_event) self.AddObserver("MiddleButtonReleaseEvent ", self.middle_button_release_event) self.AddObserver("LeftButtonPressEvent", self.left_button_press_event ) self.AddObserver("LeftButtonReleaseEvent", self.left_button_release_event) self.AddObserver ("RightButtonPressEvent", self.right_button_press_event) self.AddObserver("RightButtonReleaseEvent
typeof__(weakTask) strongTask = weakTask; [strongTask resume]; }]; } [task addObserver NSKeyValueObservingOptionNew context:NULL]; [self.uploadProgress addObserver 给Task和上传下载进度增加KVO观察 主要对应下面这几句代码 [task addObserver:self forKeyPath:NSStringFromSelector(@selector options:NSKeyValueObservingOptionNew context:NULL]; [self.uploadProgress addObserver addNotificationObserverForTask:(NSURLSessionTask *)task { [[NSNotificationCenter defaultCenter] addObserver
代码实现 public interface Subject { //添加观察者 void addObserver(Observer obj); //移除观察者 void deleteObserver String info) { System.out.println(name+"得到作业:"+info); } } public interface Subject { //添加观察者 void addObserver (Observer o) { super.addObserver(o); } @Override public synchronized void deleteObserver(Observer (messageObserverTopicA); //b关注了享知行 messagePublishObservable.addObserver(messageObserverTopicB); // c关注了享知行 messagePublishObservable.addObserver(messageObserverTopicC); messagePublishObservable.pushMessage
用这个通知去实现监听avplayer.currentItem 代码如下 //给AVPlayerItem添加播放完成通知 [[NSNotificationCenter defaultCenter] addObserver 监控缓存区大小此时我们都需要监听AVPlayerItem, //监控状态属性,注意AVPlayer也有一个status属性,通过监控它的status也可以获得播放状态 [playerItem addObserver forKeyPath:@”status” options:NSKeyValueObservingOptionNew context:nil]; //监控网络加载情况属性 [playerItem addObserver forKeyPath:@”loadedTimeRanges” options:NSKeyValueObservingOptionNew context:nil]; //监控缓冲区大小 [playerItem addObserver
NSKeyValueObservingOptionNew 接收新值 NSKeyValueObservingOptionInitial 您指示被观察对象使用选项 NSKeyValueObservingOptionInitial 发送立即更改通知(在 addObserver 可以通过这些选项的按位枚举接收多种 二、 Context [tool.ryuk addObserver:tool forKeyPath:@"name" options:NSKeyValueObservingOptionNew addObserver:forKeyPath:options:context: 消息中的 Context 指针可以包含任意数据,这些数据将在相应的更改通知中传递回观察者。 PersonAccountInterestRateContext; 注册观察者 - (void)registerAsObserverForAccount:(Account*)account { [account addObserver NSKeyValueObservingOptionOld) context:PersonAccountBalanceContext]; [account addObserver