生活随笔
收集整理的這篇文章主要介紹了
Swift
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1,通知(NSNotification)介紹
這里所說的通知不是指發(fā)給用戶看的通知消息,而是系統(tǒng)內(nèi)部進(jìn)行消息傳遞的通知。要介紹通知之前,我們需要先了解什么是觀察者模式。
觀察者模式 (Observer):指一個對象在狀態(tài)變化的時候會通知另一個對象。參與者并不需要知道其他對象的具體是干什么的 。這是一種降低耦合度的設(shè)計。常見的使用方法是觀察者注冊監(jiān)聽,然后在狀態(tài)改變的時候,所有觀察者們都會收到通知。
在 MVC 里,觀察者模式意味著需要允許 Model 對象和 View 對象進(jìn)行交流,而不能有直接的關(guān)聯(lián)。
Cocoa 使用兩種方式實(shí)現(xiàn)了觀察者模式: 一個是 Key-Value Observing (KVO),另一個便是本文要講的Notification。
2,系統(tǒng)通知的注冊和響應(yīng)
比如我們想要在用戶按下設(shè)備的home鍵,程序進(jìn)入后臺時執(zhí)行某些操作。一種辦法是在AppDelegate.swift里的applicationDidEnterBackground方法里執(zhí)行。
除此之外,由于程序進(jìn)入后臺會發(fā)送 UIApplicationDidEnterBackgroundNotification 的通知,我們可以事先注冊個監(jiān)聽這個通知的“觀察者”來處理。
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("程序進(jìn)入到后臺了")
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
|
3,使用自定義的通知
通知類型其實(shí)就是一個字符串,所以我們也可以使用自己定義的通知(同時也可以傳遞用戶自定義數(shù)據(jù))。
下面創(chuàng)建了兩個觀察者獲取下載圖片通知,同時收到通知后的處理函數(shù)內(nèi)部添加了個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("發(fā)送通知")
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) 獲取到通知,用戶數(shù)據(jù)是[(value1),(value2)]")
sleep(3)
print("(name) 執(zhí)行完畢")
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
}
|
運(yùn)行結(jié)果如下:
發(fā)送通知
觀察器1 獲取到通知,用戶數(shù)據(jù)是[hangge.com,12345]
觀察器1 執(zhí)行完畢
觀察器2 獲取到通知,用戶數(shù)據(jù)是[hangge.com,12345]
觀察器2 執(zhí)行完畢
通知完畢
(通過運(yùn)行可以看出,通知發(fā)送后的執(zhí)行時同步的,也就是觀察者全部處理完畢后,主線程才繼續(xù)往下進(jìn)行。)
原文出自:www.hangge.com轉(zhuǎn)載請保留原文鏈接:http://www.hangge.com/blog/cache/detail_828.html
總結(jié)
以上是生活随笔為你收集整理的Swift的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。