美文网首页程序员
IOS学习笔记: Notifications通知机制

IOS学习笔记: Notifications通知机制

作者: 米狗GO | 来源:发表于2018-01-24 01:51 被阅读0次

    本人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)

    相关文章

      网友评论

        本文标题:IOS学习笔记: Notifications通知机制

        本文链接:https://www.haomeiwen.com/subject/kpmwgxtx.html