iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
自我挑戰組

iOS Junior的菜雞之路系列 第 13

中央空調Notification:我想給每個訂閱者一個家

  • 分享至 

  • xImage
  •  

今天來講講Notification,因為之後要開始做導頁的相關參數傳遞,一直以來都是用Delegate在傳遞比較多,因為就不是很熟,所以來研究研究

Notification通知屬於一種觀察者模式,透過訂閱的方式來獲取資料
取我參考網址中的一句話

發佈者永遠不需要知道訂閱者的任何數據。

那麼該怎麼簡單實作呢?

  • 需要一個Post (負責拋資料)
  • 需要一個addOberver(負責接資料)

Post

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)

addObserver

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


上一篇
踩坑合集
下一篇
Frame 虐我千百遍,SnapKit待我如初戀
系列文
iOS Junior的菜雞之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言