ReactiveCocoa 4 圖解之三——存根(Disposable)

一個存根,用Disposable協議表示,是一個內存管理和取消操作的機制。

當啟動一個信號發生器(SignalProducer)時,一個存根會被返回。這個存根可以讓調用者取消剛才啟動的工作(后臺處理,網絡請求等),清除所有的臨時資源,而后在被創建的信號上發送一個Interrupted終結事件。

監聽一個信號(Signal)也可能會返回一個存根。廢棄這個存根會阻止監聽器繼續從該信號上接收事件,但是不會對信號本身發生任何影響。

關于取消機制的更多信息,可以參照RAC設計指導

—— ReactiveCocoa 框架概覽

1. Disposable協議



在ReactiveCocoa中,Disposable協議規定了所有Disposable對象的接口。這個接口十分簡單:

  1. 一個disposed只讀屬性,表示存根是否已經被廢棄。
  2. 一個dispose()實例方法,對存根進行廢棄操作(下面將要提到的“廢棄某個存根”,就是說調用某個存根的dispose()方法)。
Disposable協議

ReactiveCocoa內建了五種存根類,它們都實現了Disposable接口,這些存根類在ReactiveCocoa的?內存管理上發揮著關鍵作用。另外,如果需要打斷信號或信號發生器的工作,唯一的方法就是廢棄相應的存根(在相應的存根對象上調用dispose()方法)。

下面我們來看看這些存根類。

2. SimpleDisposable



正如其名稱,這種存根是所有存根類中最簡單的。它的disposed屬性初始值為false,一旦廢棄它,它就將disposed屬性反轉為true。僅此而已。

3. ActionDisposable



這種存根的初始化函數接收一個類型為() -> ()的方法參數,這個方法被存放在存根內部的action成員中,初始化后disposed屬性的值為false。廢棄這個存根時,它會先調用action中的方法,之后把disposed屬性的值反轉為true

4. CompositeDisposable



這是ReactiveCocoa提供的最復雜的,也是功能最強的存根類型。它內部持有一個存根集合的引用,如果這個集合為空,它的disposed屬性就為true,否則為false。可以通過addDisposable()實例方法向它的存根集合添加元素,ReactiveCocoa還為CompositeDisposable重載了+=操作符,用來添加存根元素。在廢棄這個存根時,它會倒序地遍歷內部的存根集合,將每一個存根元素從集合移除并廢棄掉;最后存根的集合為空,它自身的disposed屬性的值變為true

5. ScopeDisposable



這種存根有一個只讀的內部存根(innerDisposable)屬性。也就是說它持有另外一個存根對象,它自己完全是內部存根的“代理”:這個存根的disposed屬性值就是內部存根的disposed的屬性值,廢棄這個存根就是廢棄它的內部存根。但特別的是,ScopeDisposable定義了解構函數(deinit),在它被系統回收釋放之前,會自動廢棄內部存根。

6. SerialDisposable



這種存根有一個可讀寫的內部存根(innerDisposable)屬性。也就是說它持有另外一個存根對象,但是它的disposed屬性和內部存根無關。一旦廢棄這個存根,它會先廢棄內部存根,然后將自己的disposed屬性反轉為true。另外,innerDisposable屬性是可寫的,每一次對它進行賦值操作時,他會將先前持有的內部存根廢棄掉。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容