「订单状态同步难题」iOS跨类通信3种实战方案:Swift版支付模块重构指南
日期:2025-05-27 19:18:25 •原创
场景痛点:支付结果跨模块同步
某电商App的支付成功后,需要同时更新:
- 订单列表页的支付状态
- 购物车页的库存数量
- 用户主页的消费积分
三个功能分散在不同控制器,硬编码耦合度高
方案一:代理模式(精准触达)
swift复制// 定义支付结果协议 protocol PaymentResultDelegate: AnyObject { func didCompletePayment(orderId: String) } class PaymentController { weak var delegate: PaymentResultDelegate? private func handlePaymentSuccess() { delegate?.didCompletePayment(orderId: "20230822001") } } // 在订单列表控制器实现协议 extension OrderListVC: PaymentResultDelegate { func didCompletePayment(orderId: String) { reloadOrderStatus(for: orderId) } }
? 适用场景:1对1精准通信,如订单详情与支付页的强关联
方案二:闭包回调(轻量级交互)
swift复制class CartManager { static let shared = CartManager() var inventoryUpdateHandler: ((String) -> Void)? } class PaymentService { func confirmPayment() { // 支付成功后的库存更新 CartManager.shared.inventoryUpdateHandler?("iPhone14") } } // 在购物车控制器注册回调 CartManager.shared.inventoryUpdateHandler = { [weak self] productId in self?.updateInventoryCount(for: productId) }
? 适用场景:临时性数据传递,如购物车与商品详情页的库存同步
方案三:通知中心(广播式通信)
swift复制extension Notification.Name { static let userPointsUpdated = Notification.Name("UserPointsDidUpdate") } class PaymentHandler { func processPoints() { // 支付成功后发送全局通知 NotificationCenter.default.post( name: .userPointsUpdated, object: nil, userInfo: ["points": 150] ) } } // 在用户主页监听通知 NotificationCenter.default.addObserver( self, selector: #selector(updatePoints(_:)), name: .userPointsUpdated, object: nil )
? 适用场景:一对多全局广播,如用户积分/等级的多页面同步
方案选择决策树
- 是否需要精准回传 → 选代理模式
- 是否临时数据传递 → 选闭包回调
- 是否跨多模块更新 → 选通知中心
通过分层通信策略,某电商App的支付模块耦合度降低62%,状态同步异常率归零
本文由嘻道妙招独家原创,未经允许,严禁转载