1. 程式人生 > >使用NSNotificationCenter傳送通知,接收通知

使用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 ViewControllerUIViewController { 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 ViewControllerUIViewController { 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 MyObserverNSObject { 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! [StringAnyObject] let value1 = userInfo["value1"asString let value2 = userInfo["value2"asInt print("\(name) 獲取到通知,使用者資料是[\(value1),\(value2)]") sleep(3) print("\(name) 執行完畢") } deinit { //記得移除通知監聽 NSNotificationCenter.defaultCenter().removeObserver(self) } }