ios-使用观察者模式
来源:互联网 发布:h3c 查看端口实时流量 编辑:程序博客网 时间:2024/05/21 22:55
// 观察者模式
/*
在Cocoa Touch框架中,观察者模式的具体应用有两个:通知机制(notification)机制和KVO(Key-Value Observing)机制
*/
// 通知机制:通知机制和委托模式不同的是,前者是“一对多”的对象之间的通信,后者是“一对一”的对象之间的通信
/*
通知主要有三种:广播通知(broadcast notification)、本地通知(lacal notification)和推送通知(push notification)
广播通知:广播通知可以在一个应用内部的多个对象之间发送消息,主要是发送消息。
本地通知:本地通知是给用户一种“提示”,它的“提示”方式有警告对话框、发出声音、振动和应用图标上显示数字,在计划时间到达时,本地通知由本地ios发出。
推送通知:推送通知由第三方程序发送给苹果的远程服务器,再由远程服务器推送给ios的特定应用。
*/
通知机制实际运用:
- (void)applicationDidBecomeActive:(UIApplication *)application{ [[NSNotificationCenter defaultCenter] postNotificationName:@"appStatus" object:nil userInfo:nil]; // userInfo:是一个字典对象}
- (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc];}- (void)viewDidLoad{ [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handle:) name:@"appStatus" object:nil]; /* addObserver:注册观察者 selector:收到通知的回调方法 name:通知名称 object:通知所带的参数 */}- (void)handle:(NSNotification *)obj{ id m_obj = [obj object]; NSString *str = [obj name]; NSDictionary *dict = [obj userInfo]; NSLog(@"%@",m_obj); NSLog(@"%@",str); NSLog(@"%@",dict);}
至此,通知机制介绍已经完毕,程序运行效果如下:
2014-09-06 23:36:49.788 Test002[1963:907] (null)2014-09-06 23:36:49.789 Test002[1963:907] appStatus2014-09-06 23:36:49.790 Test002[1963:907] (null)
// KVO模式不像通知机制那样通过一个通知中心通知所有观察者,而是在对象属性变化时通知会被直接发送给观察者
/*
关键是两个方法:
addObserver: forKeyPath:options:注册观察者
observeValueForKeyPath: ofObject: change: context:观察者重写该方法以响应属性的变化
*/
KVO模式实际运用:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.watcher = [AppStatusWatcher new]; [self addObserver:self.watcher forKeyPath:@"appStatus" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"Pass Context"]; self.appStatus = @"Launch"; return YES; /* addObserver:注册的观察者 forKeyPath:要观察的属性 options:属性变化设置的选项,NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld,把属性新旧值都传递给观察者 context:是上下文,类型为(void *),因此,如果传递“空”,应该是“NULL”而非“nil” */}- (void)applicationWillResignActive:(UIApplication *)application{ self.appStatus = @"resignActive";}- (void)applicationDidEnterBackground:(UIApplication *)application{ self.appStatus = @"EnterBackground";}- (void)applicationWillEnterForeground:(UIApplication *)application{ self.appStatus = @"EnterForeground";}- (void)applicationDidBecomeActive:(UIApplication *)application{ self.appStatus = @"BecomeActive";}- (void)applicationWillTerminate:(UIApplication *)application{ self.appStatus = @"Terminate";}
//// AppStatusWatcher.h//#import <Foundation/Foundation.h>@interface AppStatusWatcher : NSObject@end
//// AppStatusWatcher.m//#import "AppStatusWatcher.h"@implementation AppStatusWatcher- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSLog(@"Property '%@' of object '%@' chaged: %@ context: %@",keyPath,object,change,context);}@end
至此,KVO模式介绍已经完毕,程序运行效果如下:
2014-09-06 23:50:17.009 Test002[2131:907] Property 'appStatus' of object '<KFAppDelegate: 0x7521290>' chaged: { kind = 1; new = Launch; old = "<null>";} context: Pass Context2014-09-06 23:50:17.015 Test002[2131:907] Property 'appStatus' of object '<KFAppDelegate: 0x7521290>' chaged: { kind = 1; new = BecomeActive; old = Launch;} context: Pass Context
0 0
- ios-使用观察者模式
- iOS 观察者模式~优缺点、使用场景
- IOS 观察者模式
- iOS设计模式:观察者
- iOS观察者模式
- iOS设计模式:观察者
- iOS--观察者模式
- iOS--观察者模式
- [ios]观察者模式【转】
- IOS 观察者模式
- IOS 观察者模式
- IOS:观察者模式
- iOS设计模式:观察者
- IOS-观察者模式
- iOS-观察者模式
- ios 观察者模式
- IOS 观察者模式
- iOS 观察者模式
- 各种 Java Thread State 第一分析法则
- poj 1122 FDNY to the Rescue!
- 手把手教大家如何在CSDN博客中插入图片
- 关于Interface中定义变量的注意事项
- 【JAVA笔记——术】java枚举类使用
- ios-使用观察者模式
- hdu4850(欧拉回路的应用)
- Java WebService入门实例
- Qt(C++)将字符串输入框中的数字字符串转换成十六进制命令的方法。
- 不错的学习资源--DV成电
- JS中对象与字符串的互相转换
- centos 7 安装和配置vncserver
- python idle 清屏问题的解决
- 开源夏令营最终总结