程序员

IOS学习笔记: Notifications通知机制

2018-01-24  本文已影响0人  米狗GO

本人IOS小白一枚,如理解有误,请各位大神补充/斧正

基本概念

什么是Notification? 英语八级的你一定知道这是通知的意思,那什么是通知呢? 

概念上,IOS的通知机制,允许一个对象通过“广播通知”的方式,告知其他的对象(通知的监听者)“有事情发生了!!!”,这些监听者在接收到通知以后,可以做出相应的处理。 

从这段鄙人很不专业的描述中可以看出:

  1. 通知机制可以实现由一个对象负责监听事件,由其他若干对象来负责事件的具体处理。(分工,降低单个对象复杂度)

  2. 通知的发送者,发送了通知A,但不知道谁会监听到通知,也不知道会被如何处理; 通知的接受者,只知道接收到通知A,也知道自己要怎么处理这个通知,但是不知道是谁发送的通知。(模块独立性)

备注: 本文讨论的是Notification,是对象之间的一种交流机制,而不是UserNotification(设置推送) , 注意区别!



实现方法:

要实现通知的功能,至少要有以下几个要素:

  1. 通知: Notification

  2. 通知发送者: 将通知放到通知中转站上

  3. 通知中转站: NotificationCenter

  4. 通知监听者: observer

这样讲还是比较模糊,也说不清楚,举一个小栗子吧!

很多人都坐过灰机,知道下灰机之后第一件事情就是取行李(shang’ce’suo),那么我们就以取行李为例吧!

我们先来捋一捋机场取行李的过程:

1. 机场工作人员拿起一个行李,贴上唯一的身份码,把行李放到传送带上

2. 我在传送带旁边等待自己的行李

3. 乘客 一旦发现自己的行李(身份码与自己手中条子上的一样),执行相应的操作( 取行李)

在这个过程中不同的对象分别充当了一下角色: 

行李: 通知(Notification)

唯一身份码: 通知名称(必须唯一,用于识别不同的通知)

传送带工作人员: 通知发送者(负责post Notification)

行李传送带: 通知中转站(NotificationCenter)

乘客: 通知监听者(observer)



代码实现:

接下来我们把取行李这个过程用代码来模拟一下,具体看看通知机制的代码实现

如图,先创建两个swift文件,分别命名为Passager.swift和AirportStaff.swift,分别代表乘客和机组成员两个类。 

备注:以下是代码展示,后面将对一些代码细节进行回顾。

Passager.swift中

AirportStaff.swift中

最后,在AppDelegate.swift文件的 application(_ didFinishLaunchingWithOptions launchOptions: )函数中进行测试

先在class外面定义两个全局变量:

然后,修改AppDelegate.swift文件中的 application(_ didFinishLaunchingWithOptions launchOptions: )函数为:

测试输出


airportStaff: I put XiaoMingLuggage on the Conveyor 

XiaoMing: Get my luggage

airportStaff: I put LaoWangLuggage on the Conveyor 

LaoWan: Get my luggage


从输出中可以看到,当发送通知“xiaomingLuggage”,只有小明做出了反应,因为小明是通知“xiaomingLuggage”的唯一监听者; 相应地,当发送通知“laowangLuggage”,只有老王做出了反应,因为老王是通知“laowangLuggage”的唯一监听者



代码细节回顾:

以下代码将当前对象(方法的调用者)注册为默认NotificationCenter的监听者(observer),并指定当前对象监听名为luggageName的通知


NotificationCenter.default.addObserver(forName: luggageName, object: nil, queue: OperationQueue.main,using:{ })


1) NotificationCenter: 是一个类,可以理解为是“通知的中转站”或者“通知展示区”,发送者将通知发送到上面,而监听者监听上面的通知,等待自己想要的通知 

2)default变量:是NotificationCenter类的一个类变量。.default代表使用默认的NotificationCenter。当然也可以不使用默认的NotificationCenter,而选择创建自己的NotificationCenter这里不做赘述。 

3)调用addObserver(forName:object:queue:using:)方法,注册当前对象为NotificationCenter的监听者()

forName: 接受一个Notification.Name类型的参数,表示通知的名称(必须是唯一的),用于指定要监听哪一个通知。

object: 接受一个对象(泛类型),表示只接收指定对象的通知。值为nil代表不指定特定的对象

queue: 接受一个队列,协调多线程操作。程序中的QueueOperation.main表示多线程

using: 接受一个closure,指定接收到通知后要执行的操作

4)建立并初始化“通知名称”对象:     Notification.Name(rawValue:String)

上一篇下一篇

猜你喜欢

热点阅读