65-Swift 之 消息通知(Notification)

一、 Notification的介绍

Swift的消息通知机制(Notification)算是同步的,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完全解耦。这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,属于典型的观察者模式。

二 、消息通知的两个重要类

  • Notification : 是消息的载体。它可以携带一些信息给消息的接受者。通过它我们还可以获取一些消息的一些基本信息。

  • NotificationCenter : 消息的控制中心。控制消息的注册、发送、移除。

三 、Notification 的介绍

// MARK: Notification 的参数和方法介绍
func introduceNotification() -> Void {
    // 由消息的名字创建消息
    let notification = Notification.init(name: Notification.Name(rawValue: "NetWork小贱"))
    
    // 消息协带的数据
    let address = "北京市朝阳区"
    let persons = ["Z":"张飞","G":"宫本","X":"小乔"]
    // 另一种创建消息的方式
    let notificationOther = Notification.init(name: Notification.Name(rawValue:"NetWork小贱"), object: address, userInfo: persons)
    // 消息的名字
    print(notification.name)
    // 获取消息携带的对象信息
    print(notificationOther.object!)
    // 获取消息携带的用户数据信息
    print(notificationOther.userInfo!)
    // 获取消息的描述
    print(notificationOther.description)
    // 获取消息的哈希值
    print(notificationOther.hashValue)
    // 比较两个消息是否相等
    let IsEqual =  notificationOther == notification
    print(IsEqual)
    
}

四 、NotificationCenter 的介绍

// MARK: NotificationCenter 的介绍
func introduceNotificationCenter(){
    // 创建一个对象
    let DefaultNotification = NotificationCenter.default
    // 注册一个消息通知
    DefaultNotification.addObserver(self, selector: #selector(notificationMethod(_:)), name: NSNotification.Name(rawValue: "NetWork小贱"), object: nil)
    // 发送消息 1 ,不携带任何消息的消息发送
    let notification = Notification.init(name: Notification.Name(rawValue: "NetWork小贱"))
    DefaultNotification.post(notification)
    
    // 发送消息 2 , 携带对象消息的消息发送
    DefaultNotification.post(name: Notification.Name(rawValue: "NetWork小贱"), object: "成功QQ吧!")
    
    // 发送消息 3 , 携带对象又携带用户信息的消息发送
    DefaultNotification.post(name: Notification.Name(rawValue: "NetWork小贱"), object: "成功QQ吧", userInfo: ["Z":"张明","X":"吓人"])
    
    // 移除注册的消息通知
    DefaultNotification.removeObserver(self)
    DefaultNotification.removeObserver(self, name: Notification.Name(rawValue: "NetWork小贱"), object: nil)
    
}

六、 消息的群发机制

  • 在注册消息通知时,name 不存在,object 存在的情况下,会接收所有 object 发出的通知。
// MARK: 消息通知机制的测试
func testNotification() -> Void {
    let textField = UITextField.init()
    NotificationCenter.default.addObserver(self, selector: #selector(methodNotification), name: nil, object: textField)
    
    // 第一种
    NotificationCenter.default.post(name: .UITextFieldTextDidEndEditing, object: textField)
    // 第二种
    NotificationCenter.default.post(name: .UITextFieldTextDidChange, object: textField)
    // 第三种
    NotificationCenter.default.post(name: .UITextFieldTextDidBeginEditing, object: textField)

}
func methodNotification() -> Void {
    print("测试触发标记")
}

测试结果

917BA22F-2AC5-406D-AA76-7C9225D2EC24.png
  • 在注册消息通知时,name 和 object 不存在,会接收所有发出的通知。
// MARK: 消息通知机制的测试
func testAllNotification() -> Void {
    let textField = UITextField.init()
    NotificationCenter.default.addObserver(self, selector: #selector(methodAllNotification(_ :)), name: nil, object: nil)
    
    NotificationCenter.default.post(name: .UITextFieldTextDidChange, object: nil)
    NotificationCenter.default.post(Notification.init(name: .init("NetWork")))
    NotificationCenter.default.post(name: .UITextFieldTextDidChange, object: textField)
    NotificationCenter.default.post(name: .UIKeyboardDidHide, object: nil, userInfo: [:])
    
}
func methodAllNotification(_ notification:Notification) {
    print("测试所有触发消息的标记")
    print(notification)
}

  • 在注册消息通知时,name 存在 ,object 不存在,会接收所有name发出的通知。
// MARK: 消息机制的测试
func testNameNotification() {
    NotificationCenter.default.addObserver(self, selector: #selector(methodnameNotification), name: NSNotification.Name(rawValue: "NetWork"), object: nil)
    
    NotificationCenter.default.post(Notification.init(name: NSNotification.Name(rawValue: "NetWork")))
    NotificationCenter.default.post(name: .UIKeyboardDidHide, object: nil, userInfo: nil)
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NetWork"), object: "成功QQ吧", userInfo: [:])

}

func methodnameNotification()  {
    print("name 消息的测试")

}

七 、 消息机制的回调

open func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Swift.Void) -> NSObjectProtocol

这个方法返回一个NSObjectProtocol 的对象,参数中并没有指定具体的观察者。实际上,与前一个方法不同的是,前者使用一个现存的对象作为观察者,而这个方法会创建一个匿名的对象作为观察者(即方法返回的NSObjectProtocol对象),这个匿名对象会在指定的队列(queue)上去执行我们的block。

1》上面函数参数的介绍
  • name : 消息的名字,也是一个标示。

  • object : 消息观察的对象,可为nil。

  • queue : 消息观察所在的队列,可为nil。如果为nil ,则回调将在发起消息的队列线程中执行。

  • block : 消息的回调。

注意: 在回调内小心对象的循环引用。

2》消息的回调测试和使用
1、 queue 为nil的情况
// MARK: 消息的通知回调
func callBackNotification() {
    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "NetWork小贱"), object: nil, queue: nil) { (notif) in
        print("接受的线程:" + "\(Thread.init())")
        print("回调成功")
    }
    DispatchQueue.main.async {
        print("发送的线程:" + "\(Thread.init())")
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NetWork小贱"), object: nil)
    }

    
}

测试结果

D9691BE1-3FA9-43CC-B9E8-948D34F0AF90.png
2、queue 不为nil,发起消息不在同一个线程
// MARK: 消息的通知回调
func callBackNotification() {
    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "NetWork小贱"), object: nil, queue: OperationQueue.main) { (notif) in
        print("接受的线程:" + "\(Thread.init())")
        print("回调成功")
    }
    
    DispatchQueue.global().async {
        print("发送的线程:" + "\(Thread.init())")
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NetWork小贱"), object: nil)
    }
}

测试结果

9FEA9111-29A3-48FA-8411-06480B8CDE8B.png
3、 queue 不为nil,发起消息在同一个线程
// MARK: 消息的通知回调
func callBackNotification() {
    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "NetWork小贱"), object: nil, queue: OperationQueue.main) { (notif) in
        print("接受的线程:" + "\(Thread.init())")
        print("回调成功")
    }
    
    DispatchQueue.main.async {
        print("发送的线程:" + "\(Thread.init())")
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NetWork小贱"), object: nil)
    }
}

测试结果

D9DF7B66-C983-448F-869D-028CBDDCEB51.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知...
    莫离_焱阅读 6,484评论 1 8
  • 转载自南峰子的技术博客 一个NSNotificationCenter对象(通知中心)提供了在程序中广播消息的机制,...
    我消失1314阅读 873评论 0 2
  • NSNotificationCenter对象(通知中心)提供了在程序中广播消息的机制,它实质上就是一个通知分发表。...
    9de75b652cd9阅读 750评论 0 1
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,113评论 29 470
  • 雨微凉,人独立,乱花丛中,又见伊人倩影; 眼迷离,心憔悴,水色朦胧,不知佳人何处. 兀自伫立于雨中,既有期待又不作...
    梦星杀云阅读 312评论 0 5