Swift - 使用NSNotificationCenter发送通知,接收通知

1,通知(NSNotification)介绍

这里所说的通知不是指发给用户看的通知消息,而是系统内部进行消息传递的通知。要介绍通知之前,我们需要先了解什么是观察者模式。

观察者模式 (Observer):指一个对象在状态变化的时候会通知另一个对象。参与者并不需要知道其他对象的具体是干什么的 。这是一种降低耦合度的设计。常见的使用方法是观察者注册监听,然后在状态改变的时候,所有观察者们都会收到通知。

在 MVC 里,观察者模式意味着需要允许 Model 对象和 View 对象进行交流,而不能有直接的关联。

Cocoa 使用两种方式实现了观察者模式: 一个是 Key-Value Observing (KVO),另一个便是本文要讲的Notification。

2,系统通知的注册和响应

比如我们想要在用户按下设备的home键,程序进入后台时执行某些操作。一种办法是在AppDelegate.swift里的applicationDidEnterBackground方法里执行。

除此之外,由于程序进入后台会发送 UIApplicationDidEnterBackgroundNotification 的通知,我们可以事先注册个监听这个通知的“观察者”来处理。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

import UIKit

class ViewController: UIViewController {

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        let notificationCenter = NSNotificationCenter.defaultCenter()

        

        let operationQueue = NSOperationQueue.mainQueue()

        

        let applicationDidEnterBackgroundObserver =

            notificationCenter.addObserverForName(UIApplicationDidEnterBackgroundNotification,

                object: nil, queue: operationQueue, usingBlock: {

                (notification: NSNotification!) in

                    print("程序进入到后台了")

        })

        

        //如果不需要的话,记得把相应的通知注册给取消,避免内存浪费或奔溃

        //notificationCenter.removeObserver(applicationDidEnterBackgroundObserver)

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

}

3,使用自定义的通知

通知类型其实就是一个字符串,所以我们也可以使用自己定义的通知(同时也可以传递用户自定义数据)。

下面创建了两个观察者获取下载图片通知,同时收到通知后的处理函数内部添加了个3秒的等待。

--- ViewController.swift ---


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import UIKit

class ViewController: UIViewController {

    

    let observers = [MyObserver(name: "观察器1"),MyObserver(name: "观察器2")]

    override func viewDidLoad() {

        super.viewDidLoad()

        

        print("发送通知")

        NSNotificationCenter.defaultCenter().postNotificationName("DownloadImageNotification",

            object: self, userInfo: ["value1":"hangge.com", "value2" : 12345])

        print("通知完毕")

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

}

--- MyObserver.swift ---


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

import UIKit

class MyObserver: NSObject {

    

    var name:String = ""

    init(name:String){

        super.init()

        

        self.name = name

        NSNotificationCenter.defaultCenter().addObserver(self, selector:"downloadImage:",

            name: "DownloadImageNotification", object: nil)

    }

    

    func downloadImage(notification: NSNotification) {

        let userInfo = notification.userInfo as! [String: AnyObject]

        let value1 = userInfo["value1"] as! String

        let value2 = userInfo["value2"] as! Int

        

        print("\(name) 获取到通知,用户数据是[\(value1),\(value2)]")

        

        sleep(3)

        

        print("\(name) 执行完毕")

    }

    deinit {

        //记得移除通知监听

        NSNotificationCenter.defaultCenter().removeObserver(self)

    }

   

}

运行结果如下:

发送通知
观察器1 获取到通知,用户数据是[hangge.com,12345]
观察器1 执行完毕
观察器2 获取到通知,用户数据是[hangge.com,12345]
观察器2 执行完毕
通知完毕

(通过运行可以看出,通知发送后的执行时同步的,也就是观察者全部处理完毕后,主线程才继续往下进行。)

原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_828.html

时间: 2024-10-20 12:27:02

Swift - 使用NSNotificationCenter发送通知,接收通知的相关文章

通过NSNotificationCenter 发送通知

问题: 想在APP中发布一条通知,同时允许其他对象接收通知并根据你广播的内容采取相应的行动. 讨论: 通知中心是通知对象的派送中心, 例如,在用户使用 App 时如果键盘显示出来了,iOS 会发送一条通知到你的应用,程序中的任何对象都可以通过将自己添加到通知中心,作为一个观察者,来监听此通知.当对象的的生命周期即将结束时,需要将该对象从通知中心的派送表中移除. 这样,一条通知就相当于一个消息被通知中心广播给它的观察者.通知中心是 NSNotificationCenter 类的一个实例对象.我们通

[Apple开发者帐户帮助]六、配置应用服务(5.3)推送通知(APN):从您的Web服务器发送推送通知

要使用APN从Web服务器向macOS用户发送推送通知,请注册网站推送标识符并创建网站推送证书. 对于每个网站,请注册一个网站推送标识符,用于验证通知是否来自您的服务器.然后创建一个网站推送证书以签署您的通知包并向用户发送通知.将证书与您的网站推送标识符相关联. 所需角色:帐户持有人或管理员. 注册网站推送标识符 在“ 证书”,“标识符和配置文件”中,从左侧的弹出菜单中选择操作系统. 在“标识符”下,选择“网站推送ID”,然后单击右上角的“添加”按钮(+). 输入网站描述和标识符,然后单击继续.

XMPP系列(四)---发送和接收文字消息,获取历史消息功能

今天开始做到最主要的功能发送和接收消息.获取本地历史数据. 先上到目前为止的效果图:              首先是要在XMPPFramework.h中引入数据存储模块: //聊天记录模块的导入 #import "XMPPMessageArchiving.h" #import "XMPPMessageArchivingCoreDataStorage.h" #import "XMPPMessageArchiving_Contact_CoreDataObje

JavaWeb学习总结(五十一)——邮件的发送与接收原理

一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu.163等等他们都有自己的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一

DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只有一个:基于C#的fo-dicom库具有高封装性.对于初学者来说实现大多数的DIMSE-C.DIMSE-N服务几乎都是"傻瓜式"操作--构造C-XXX-RQ.N-XXX-RQ然后绑定相应的OnResponseReceived处理函数即可.本博文希望在前几篇预热的基础上,对比DCMTK.fo

Bluemix结合RabbitMq实现消息发送与接收实例

什么是RabbitMq? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求. 什么是Bluemix? BlueMix 是 IBM 基于 Cloud Foundr

深入分析JavaWeb Item41 -- 邮件的发送与接收原理

一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu.163等等他们都有自己的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一

Chromium的IPC消息发送、接收和分发机制分析

由于Chromium采用多进程架构,因此会涉及到进程间通信问题.通过前面一文的学习,我们知道Browser进程在启动Render进程的过程中会建立一个以UNIX Socket为基础的IPC通道.有了IPC通道之后,接下来Browser进程与Render进程就以消息的形式进行通信.我们将这种消息称为IPC消息,以区别于线程消息循环中的消息.本文就分析Chromium的IPC消息发送.接收和分发机制. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Chrom

iWatchk开发:实现iWatch 与 iPhone 之间数据发送与接收

上一代的iwatch 与iPhone 数据交互使用的是 openParentApplication 函数,在Watch OS2 中摒弃了这种方法,引入了WCSesison 来进行iwatch 与iPhone的数据发送与接收. iWatch 端该如何像iphone 发送数据 在InterfaceController 头文件中, 引入 WatchConnectivity/WatchConnectivity.h, 添加 WCSessionDelegate代理: #import <WatchKit/Wa