一個存根,用
Disposable
協議表示,是一個內存管理和取消操作的機制。
當啟動一個信號發生器(
SignalProducer
)時,一個存根會被返回。這個存根可以讓調用者取消剛才啟動的工作(后臺處理,網絡請求等),清除所有的臨時資源,而后在被創建的信號上發送一個Interrupted
終結事件。
監聽一個信號(
Signal
)也可能會返回一個存根。廢棄這個存根會阻止監聽器繼續從該信號上接收事件,但是不會對信號本身發生任何影響。
關于取消機制的更多信息,可以參照RAC設計指導。
1. Disposable協議
在ReactiveCocoa中,Disposable
協議規定了所有Disposable
對象的接口。這個接口十分簡單:
- 一個
disposed
只讀屬性,表示存根是否已經被廢棄。 - 一個
dispose()
實例方法,對存根進行廢棄操作(下面將要提到的“廢棄某個存根”,就是說調用某個存根的dispose()
方法)。
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
屬性是可寫的,每一次對它進行賦值操作時,他會將先前持有的內部存根廢棄掉。