本文首發於 Ficow Shen's Blog,原文地址: Combine 框架,從0到1 —— 4.在 Combine 中使用通知。
內容概覽
- 前言
- 讓通知處理程式碼使用 Combine
- 總結
前言
通知中心是蘋果開發者常用的功能,很多框架都會使用通知中心來向外部傳送非同步事件。對於iOS開發人員而言,以下程式碼一定非常眼熟:
var notificationToken: NSObjectProtocol?
override func viewDidLoad() {
super.viewDidLoad()
notificationToken = NotificationCenter.default
.addObserver(forName: UIDevice.orientationDidChangeNotification,
object: nil,
queue: nil) { _ in
if UIDevice.current.orientation == .portrait {
print ("Orientation changed to portrait.")
}
}
}
現在,讓我們來學習如何使用 Combine
處理通知,並將已有的通知處理程式碼遷移到 Combine
。
讓通知處理程式碼使用 Combine
使用通知中心回撥和閉包要求您在回撥方法或閉包內完成所有工作。通過遷移到 Combine
,您可以使用操作符來執行常見的任務,如:filter
。
想充分利用 Combine
,請使用 NotificationCenter.Publisher
將您的 NSNotification
處理程式碼遷移到 Combine
習慣用法。您可以使用 NotificationCenter
方法 publisher(for:object:)
建立釋出者,並傳入您感興趣的通知名稱和可選的源物件。
var cancellable: Cancellable?
override func viewDidLoad() {
super.viewDidLoad()
cancellable = NotificationCenter.default
.publisher(for: UIDevice.orientationDidChangeNotification)
.filter() { _ in UIDevice.current.orientation == .portrait }
.sink() { _ in print ("Orientation changed to portrait.") }
}
如上面的程式碼所示,在 Combine
中重寫了最上面的程式碼。此程式碼使用了預設的通知中心來為orientationDidChangeNotification
通知建立釋出者。當程式碼從該釋出者接收到通知時,它使用過濾器操作符 filter(_:)
來實現只處理縱向螢幕通知的需求,然後列印一條訊息。
需要注意的是,orientationDidChangeNotification
通知的 userInfo
字典中不包含新的螢幕方向,因此 filter(_:)
操作符直接查詢了 UIDevice
。
總結
雖然上面的示例無法突顯 Combine
的優勢,但是我們可以自行想象。使用 Combine
之後,如果需求變得很複雜,我們要做的可能只是增加操作符而已,而且不破壞鏈式呼叫程式碼的易讀性。
朋友,行動起來吧!把現有專案中的舊程式碼重構成使用 Combine
的程式碼~
本文內容來源:
Routing Notifications to Combine Subscribers