您的位置:首页 > 移动开发 > IOS开发

OC学习日记012(一)通知——观察者模式的另一种形式

2016-08-16 18:58 309 查看


注意:

我们随着学习的深入,在对KVC和KVO以及通知的学习中,我们发现原来简单的命令行的程序已经不能直观的反映我们学习的问题了,而且为了对后面UI的学习,我们可以新建IOS工程里面的Single View Application 项目,以便我们之后的学习。



我们进去以后运行工程,系统会为我们生成你选择的一个iphone的模拟器。

以下是一些常用快捷键:

Cmd+1/2/3/4/5 可以切换模拟器的显示比例。

command+Shift+H 模拟器的Home键。

command+Shift+H(两次) 模拟器的Home键连按效果,管理运行的程序。

Cmd+向左箭头/向右箭头 切换横竖屏。

Option+Shift 可以在模拟器中调出双指拖动效果。

Option 可以在模拟器中调出双指放大缩小效果。

command+Q 关闭模拟器



这个模拟器会记录我们之前建立的一些项目,比如你装了Coco2dx,然后建立了一个hellworld模版,它也会显示在里面.

当然,暂时我们不会用到这个模拟器很多,包括前端控件的使用会在后面的IOS开发基础中涉及。



我们现在只会暂时用到ViewController.m文件,这个是ios运行时反馈到后台控制以及后台的一些数据输出的界面,运行的结果不会显示在模拟器里面,我们可以把这个文件当作我们之前的main.m文件。

通知 NSNotificaiton

通过学习KVO,我们发现KVO是一种简单的观察者设计模式,涉及到两个步骤,分别是观察者和被观察者。这种方式实质有很大的局限性,那么OC的‘Foundation’模型又分为开发者提供了新的一种观察者设计模式,即通知。

通知,是一种发送给一个或多个观察者,用来通知其在程序中发生了某个事件的消息。Cocoa中的通知机制遵循的是一种广播的模式。它是一种程序中事件的发起者或者是处理者和其他想要知道该事件的对象沟通的一种方式。消息的接受者,也就是观察者响应该事件来改变自己的UI、行为或者状态。

在OC中,使用NSNotification类来表示一个通知

初始化一个通知NSNotification的实例对象

NSNotification *notification1=[NSNotification notificationWithName:@"通知名称1" object:self];
NSNotification *notification2=[NSNotification notificationWithName:@"通知名称"object:self userInfo:@{@"content:":@"hello: world"}];


以下为这个方法两个值应该输入的东西^-^:

NSNotification *notification6=[NSNotification notificationWithName:... object:...];


Name:通知名称

object:通知发起人

通知中心

(单例类,拿到通知中心的单例)

NSNotificationCenter *center=[NSNotificationCenter defaultCenter];


建立通知的发送机制,如下:

1.注册相关的监听者,并实现在需要的时候回调方法
2.在需要的时候,被监听者的对象去到通知中心发送消息
3.移除监听者


在Student类文件中,我们建立一个通知的发送机制:

注册监听者

/*
1.要去接受通知的对象
2.接受通知要回调的相应方法
3.接受通知的名字
4.发起通知的对象,一般我们不需要知道,把它写成nil
*/


@implementation Student
-(id)init{
if (self=[super init]) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction:) name:@"通知名称2" object:nil];
}
return self;
}


回调方法

-(void)notificationAction:(NSNotification *)notification{
NSLog(@"%@",notification.userInfo);
}


移除监听者

-(void)dealloc{
//移除某个通知的监听者
//[[NSNotificationCenter defaultCenter]removeObserver:self name:@"通知名称2" object:nil];
//移除所有通知的监听者
[[NSNotificationCenter defaultCenter]removeObserver:self];
}


在ViewController.m文件中:

Student *student=[[Student alloc]init];
[center postNotification:notification2];


下面两种可以不用重新建立通知,直接使用

[center postNotificationName:@"通知名称3" object:self];
[center postNotificationName:@"通知名称4" object:self userInfo:@{@"ss":@"ww"}];


Weather *weather =[[Weather alloc]init];
PhoneUser *phoneUser =[[PhoneUser alloc]init];

[weather sendMessage];

_weather=weather;
_phoneUser=phoneUser;


}

在- (void)viewDidLoad 外,我们可以建立touch的方法

-(void)touchesBegan:(NSSet
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息