Swift使用NSHashTable實現(xiàn)一對多協(xié)議調(diào)用

NSHashTable是iOS中一種集合類型,它類似于集合Set。但其中可以添加弱引用weak元素。相關介紹可以參考Cocoa 集合類型:NSPointerArray,NSMapTable,NSHashTable。

定義協(xié)議LikeDelegate,并在需要的ViewController中實現(xiàn)協(xié)議。

protocol LikeDelegate {
    func refreshLikeStatus()
}

定義Manager保存NSHashTable集合,options選擇weakMemory使其中保存的元素弱引用:

struct LikeManager {
    static var hashVC: NSHashTable = NSHashTable<UIViewController>(options: .weakMemory)
}

在實現(xiàn)LikeDelegate協(xié)議的UIViewController初始化時添加自身到NSHashTable中:

override func viewDidLoad() {
        super.viewDidLoad()
        LikeManager.hashVC.add(self)
}

在需要調(diào)用協(xié)議時,通過遍歷集合中還沒被釋放的元素并調(diào)用實現(xiàn)的協(xié)議方法:

 var list: [UIViewController]? = LikeManager.hashVC.allObjects
 for delegate in list ?? [] {
      if let dele = delegate as? LikeDelegate {
          dele.refreshLikeStatus()
      }
 }

通過遍歷沒有被釋放的協(xié)議,并調(diào)用其中的方法。其中調(diào)用allObjects生成數(shù)組時會強引用UIViewController,使用的時候需要注意內(nèi)存管理。

使用NSPointerArray,NSMapTable同樣也可以實現(xiàn)上述效果,看官可以自行嘗試。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容