今天來講講Notification,因為之後要開始做導頁的相關參數傳遞,一直以來都是用Delegate在傳遞比較多,因為就不是很熟,所以來研究研究
Notification通知屬於一種觀察者模式,透過訂閱的方式來獲取資料
取我參考網址中的一句話
發佈者永遠不需要知道訂閱者的任何數據。
那麼該怎麼簡單實作呢?
let notificationName = Notification.Name(rawValue: "deliveryData")
// 這個Dictionary的Key
let userInfoName: AnyHashable = "UserInfo"
// 使用資料結構就可以一次傳遞不只一個參數
struct DelieveryData {
let text: String
let index: Int
}
// 這個Dictionary的Value
let deliveryData = DeliveryData(text: "學妹 你洗澡洗完了沒?", index: 1)
//組合起來
let data: [AnyHashable: Any]? = [userInfoName: deliveryData]
// 吐資料方(該通知的Name, 特定Object?, 資料:Dictionary形式)
NotificationCenter.default.post(name: notificationName, object: nil, userInfo: data)
let notificationName = Notification.Name(rawValue: "deliveryData")
// 要先執行addObserver,這樣別人Post才會接收得到
// 接收方(誰執行, 執行Func, 該通知的Name, 傳送特定Object?)
NotificationCenter.default.addObserver(self, selector: #selector(),name: notificationName, object: nil)
@objc func showThem(_ notification: Notification) {
guard let data = notification.userInfo?["UserInfo"] as? DeliveryData
self.showLabel.text = "編號\(index)\(name)"
// 結果就會變成 "編號1學妹 你洗澡洗完了沒?"
}
Notification方式也是一個一對多的方式,只是要對象有addObserver,那麼都能接收到同樣的資訊
針對那種相隔很遠的ViewController就非常好用
尤其是針對像是登入功能,因為登入之後,所有頁面的資料就需要Loading到位,那麼使用Notification方式,其他有接收到資料的那方就可以開始進行Reload工作了。
以上就是這樣,也能夠使用KVO方式,也是一種觀察者模式,但我比較喜歡用Notification方式
https://www.appcoda.com.tw/notificationcenter/
https://wilden-chen.gitbook.io/swift-design-patterns/observer/notification