博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift - 使用NSNotificationCenter发送通知,接收通知
阅读量:4965 次
发布时间:2019-06-12

本文共 2857 字,大约阅读时间需要 9 分钟。

转载自:http://www.mamicode.com/info-detail-1069228.html

标签:

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 执行完毕
通知完毕

转载于:https://www.cnblogs.com/AnnieBabygn/p/5689120.html

你可能感兴趣的文章
Gitlab配置、备份、升级、迁移
查看>>
dataTable.NET的search box每輸入一個字母進行一次檢索的問題
查看>>
Python 文件处理
查看>>
邻接表详解
查看>>
android,radio,checkbox
查看>>
[转](.NET Core C#) AES Encryption
查看>>
[转]EntityFramework中常用的数据修改方式
查看>>
[转]SQL Collation冲突解决 临时表
查看>>
[转]Gitlab-CI持续集成之Runner配置和CI脚本
查看>>
Spark&Hive结合起来
查看>>
使用Flex和java servlet上传文件
查看>>
软件工程的实践项目课程的自我目标
查看>>
POJ 1321 棋盘问题 (深搜)
查看>>
自定义TabBar
查看>>
最近戴着眼镜坐电脑前总是不自觉的眼痛就搜了下怎么保护眼睛无意中看到了这篇文章希望广大爱好编程的朋友多注意保护自己的眼睛!!...
查看>>
Eclipse快捷键大全
查看>>
Let's Chat ZOJ - 3961
查看>>
该不该主动去联系多年未联系的老同学?看完这篇文章你再回答
查看>>
业务逻辑漏洞个人经验集锦【不定时更新~】
查看>>
[Swift] Storyboard outlet and action
查看>>