1. 主页 > 好文章

「订单状态同步难题」iOS跨类通信3种实战方案:Swift版支付模块重构指南


场景痛点:支付结果跨模块同步

某电商App的支付成功后,需要同时更新:

  1. 订单列表页的支付状态
  2. 购物车页的库存数量
  3. 用户主页的消费积分
    三个功能分散在不同控制器,硬编码耦合度高

方案一:代理模式(精准触达)

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
)

? 适用场景:一对多全局广播,如用户积分/等级的多页面同步


方案选择决策树

  1. 是否需要精准回传 → 选代理模式
  2. 是否临时数据传递 → 选闭包回调
  3. 是否跨多模块更新 → 选通知中心

通过分层通信策略,某电商App的支付模块耦合度降低62%,状态同步异常率归零

本文由嘻道妙招独家原创,未经允许,严禁转载