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

这篇博客介绍了iOS开发中的通知(NSNotification)机制,作为观察者模式的一种形式。内容涵盖初始化NSNotification对象、通知中心的操作,以及在ViewController中如何注册、响应和移除监听者。博主强调了通知在程序事件通信中的广播模式,并通过代码示例展示了如何在Student类和ViewController中实现通知的发送和接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

注意:

我们随着学习的深入,在对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值