MST

星途 面试题库

面试题:Swift 观察者模式与通知中心的深度融合及应用场景

阐述在复杂 iOS 应用架构中,如何将 Swift 观察者模式与通知中心深度融合,以解决跨模块通信的问题。并举例说明在一个大型电商应用中,从商品列表页到购物车模块,如何利用这种融合机制实现数据更新与交互的高效管理。
43.4万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

1. Swift 观察者模式与通知中心融合思路

  1. 定义观察者协议
    • 在 Swift 中,通过定义协议来确定观察者需要实现的方法。例如:
protocol ShoppingCartObserver {
    func cartItemsUpdated(_ items: [Product])
}
  1. 通知中心注册与通知发送
    • 使用 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)
  1. 观察者模式的具体实现
    • 除了通知中心的注册回调,还可以维护一个观察者数组,在特定事件发生时主动调用观察者的方法。例如,购物车数据发生变化时:
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. 大型电商应用举例

  1. 商品列表页
    • 当用户点击商品列表中的“加入购物车”按钮时,首先创建商品对象,并通过通知中心发送商品添加到购物车的通知。
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)
    }
}
  1. 购物车模块
    • 购物车模块在初始化时,注册监听“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 观察者模式与通知中心深度融合,实现了商品列表页到购物车模块之间数据更新与交互的高效管理,确保各个模块能够及时响应数据变化,同时保持代码的可维护性和模块间的低耦合。