首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 通知中心多觀察者執行順序不確定性及解決方案

     編輯:程式設計綜合問答

觀察者調用順序本質

NotificationCenter 內部以無序集合(如 NSHashTable)存儲觀察者,**不保證調用順序**

。順序可能隨註冊順序、內存佈局、系統版本變化而改變,**不可依賴**。

業務衝突時的三種解耦策略

  1. 合併邏輯:將順序敏感操作合併為單一觀察者處理,消除跨觀察者依賴。
  2. 串行隊列調度:觀察者內部將任務提交至同一串行 DispatchQueue,保證先後順序。
    let serialQueue = DispatchQueue(label: "com.app.notification.serial")
    NotificationCenter.default.addObserver(forName: .myEvent, object: nil, queue: nil) { _ in
        serialQueue.async { /* 順序執行的任務 */ }
    }
    
  3. 狀態機驅動:引入狀態標記,觀察者檢查前置條件滿足後再執行,不滿足則重新發送通知或註冊下一階段觀察者。

反模式警示

  • 嘗試通過 performSelector:afterDelay: 強行排序,不可靠且難維護。
  • 在觀察者中直接調用其他觀察者的私有方法,破壞封裝。

最佳實踐原則

設計通知時假設「順序隨機」,通過架構手段消除順序耦合,而非試圖控制順序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved