使用NSNotificationCenter傳送通知,接收通知
阿新 • • 發佈:2019-01-03
1,通知(NSNotification)介紹
這裡所說的通知不是指發給使用者看的通知訊息,而是系統內部進行訊息傳遞的通知。要介紹通知之前,我們需要先了解什麼是觀察者模式。
觀察者模式 (Observer):指一個物件在狀態變化的時候會通知另一個物件。參與者並不需要知道其他物件的具體是幹什麼的 。這是一種降低耦合度的設計。常見的使用方法是觀察者註冊監聽,然後在狀態改變的時候,所有觀察者們都會收到通知。
在 MVC 裡,觀察者模式意味著需要允許 Model 物件和 View 物件進行交流,而不能有直接的關聯。
Cocoa 使用兩種方式實現了觀察者模式: 一個是 Key-Value Observing (KVO),另一個便是本文要講的Notification。
2,系統通知的註冊和響應
比如我們想要在使用者按下裝置的home鍵,程式進入後臺時執行某些操作。一種辦法是在AppDelegate.swift裡的applicationDidEnterBackground方法裡執行。
除此之外,由於程式進入後臺會發送 UIApplicationDidEnterBackgroundNotification 的通知,我們可以事先註冊個監聽這個通知的“觀察者”來處理。
3,使用自定義的通知 通知型別其實就是一個字串,所以我們也可以使用自己定義的通知(同時也可以傳遞使用者自定義資料)。 下面建立了兩個觀察者獲取下載圖片通知,同時收到通知後的處理函式內部添加了個3秒的等待。
--- ViewController.swift ---
--- 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 |
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 )
}
}
|