In this chapter, you have learned about multicasting using ConnectableObservable and Subject. The biggest takeaway is that Observable operators result in separate streams of events for each Observer that subscribes to it. If you want to consolidate these multiple streams into a single stream to prevent redundant work, the best way is to call publish() on an Observable to yield ConnectableObservable. You can then manually call connect() to fire emissions once your observers are set up or automatically trigger a connection using autoConnect() or refCount().
Multicasting also enables replaying and caching, so a tardy Observer can receive missed emissions. A Subject object provides a way to multicast and cache emissions as well, but you should only utilize it if existing operators cannot achieve what you want.
In the next chapter, we will start working with concurrency. This...