2013-05-14 42 views
2

嗨我一直在想一段時間Subject<T>處置所有基於它的訂閱,如果你手動調用它的Dispose方法。但是我最近發現它不能這樣工作,它只是清除它的內部觀察者集合,並用DisposedObserver輔助類實例替換它。爲什麼主題<T> .Dispose爲什麼不處理當前訂閱?

我發現自己對行爲有點困惑,只是假設「正常」只會傳播和處理所有的用戶。後來,試圖找出爲什麼這樣設計,我猜想了他們爲什麼這樣設計的幾個原因。

  • 審稿人可能是一個組成部分依賴於主題,所以處置的完全傳播沒有意義。即。正如大家所期待的那樣,合併不僅僅是因爲其中一個來源被處置掉了。
  • Subject.Dispose它在語義上等同於從觀察者側面延續Observable.Never。 Subject.Dispose調用者也可以調用OnComplete或OnError,如果想要在處理前發出錯誤或完成信號(因爲它們在相同範圍內)。

編輯提示: 對不清楚的問題。我已經瞭解如何使用它,這更像是一個設計問題。讓我更清楚地陳述它。

爲什麼您認爲Rx的設計者使Dispose行爲如此呢?

(以上兩點是我的回答試行)

+0

你應該添加你的答案作爲答案,而不是把它們放在問題中。 – 2013-05-14 17:08:49

+1

更有趣的問題(至少對我來說)是爲什麼他們甚至提出了「IDisposable」主題。 – Brandon 2013-05-14 21:03:12

+0

這是一個很好的問題 - 據我所知,Rx本身並沒有使用它。 – 2013-05-14 22:07:58

回答

5

主題應表明它是通過發送的onComplete或可能的OnError完成。這是慣用和語法上正確的Rx。訂閱者負責通過處置訂閱來結束訂閱。您應該編寫Observables,這樣即使用戶沒有退訂,他們也會在「完成」後清理資源。

相關問題