1. Swift 观察者模式与通知中心融合思路
- 定义观察者协议:
- 在 Swift 中,通过定义协议来确定观察者需要实现的方法。例如:
protocol ShoppingCartObserver {
func cartItemsUpdated(_ items: [Product])
}
- 通知中心注册与通知发送:
- 使用
NotificationCenter.default
进行注册和发送通知。注册时,观察者(符合上述协议的对象)将自己添加到通知中心,监听特定通知。
- 例如,在购物车模块初始化时:
class ShoppingCart: ShoppingCartObserver {
init() {
NotificationCenter.default.addObserver(self, selector: #selector(cartItemsUpdated(_:)), name: NSNotification.Name("ProductAddedToCart"), object: nil)
}
@objc func cartItemsUpdated(_ notification: NSNotification) {
if let items = notification.userInfo?["cartItems"] as? [Product] {
// 更新购物车界面等操作
}
}
}
- 当商品添加到购物车时,在商品列表页或相关模块发送通知:
let product = Product(name: "iPhone 14", price: 999)
let userInfo = ["cartItems": [product]]
NotificationCenter.default.post(name: NSNotification.Name("ProductAddedToCart"), object: nil, userInfo: userInfo)
- 观察者模式的具体实现:
- 除了通知中心的注册回调,还可以维护一个观察者数组,在特定事件发生时主动调用观察者的方法。例如,购物车数据发生变化时:
class ShoppingCart {
private var observers: [ShoppingCartObserver] = []
func addObserver(_ observer: ShoppingCartObserver) {
observers.append(observer)
}
func removeObserver(_ observer: ShoppingCartObserver) {
observers = observers.filter { $0!== observer }
}
func updateCartItems(_ items: [Product]) {
// 更新购物车数据
for observer in observers {
observer.cartItemsUpdated(items)
}
// 同时也可以发送通知
let userInfo = ["cartItems": items]
NotificationCenter.default.post(name: NSNotification.Name("CartDataUpdated"), object: nil, userInfo: userInfo)
}
}
2. 大型电商应用举例
- 商品列表页:
- 当用户点击商品列表中的“加入购物车”按钮时,首先创建商品对象,并通过通知中心发送商品添加到购物车的通知。
class ProductListViewController: UIViewController {
@IBAction func addToCartButtonTapped(_ sender: UIButton) {
let product = Product(name: "MacBook Pro", price: 1999)
let userInfo = ["cartItems": [product]]
NotificationCenter.default.post(name: NSNotification.Name("ProductAddedToCart"), object: nil, userInfo: userInfo)
}
}
- 购物车模块:
- 购物车模块在初始化时,注册监听“ProductAddedToCart”通知。同时,购物车自身维护观察者列表,当购物车内部数据发生变化(如商品数量改变、删除商品等)时,主动调用观察者的方法,并通过通知中心发送通知。
class ShoppingCartViewController: UIViewController, ShoppingCartObserver {
override func viewDidLoad() {
super.viewDidLoad()
ShoppingCart.shared.addObserver(self)
NotificationCenter.default.addObserver(self, selector: #selector(cartItemsUpdated(_:)), name: NSNotification.Name("ProductAddedToCart"), object: nil)
}
deinit {
ShoppingCart.shared.removeObserver(self)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name("ProductAddedToCart"), object: nil)
}
@objc func cartItemsUpdated(_ notification: NSNotification) {
if let items = notification.userInfo?["cartItems"] as? [Product] {
// 更新购物车界面展示
}
}
func cartItemsUpdated(_ items: [Product]) {
// 更新购物车界面展示
}
}
- 这样,通过将 Swift 观察者模式与通知中心深度融合,实现了商品列表页到购物车模块之间数据更新与交互的高效管理,确保各个模块能够及时响应数据变化,同时保持代码的可维护性和模块间的低耦合。