2015-09-11 9 views
10

मैं सोच रहा था कि cache() ऑपरेटर था जो उत्सर्जन के x संख्या को कैश कर सकता था लेकिन निर्दिष्ट समय अंतराल (उदा। 1 मिनट) के बाद भी उन्हें समाप्त कर सकता था। मैं कुछ तरह के लिए देख रहा था ...RxJava- कैश() replay() के समान है?

Observable<ImmutableList<MyType>> cachedList = otherObservable 
    .cache(1, 1, TimeUnit.MINUTES); 

यह एक आइटम कैश होगा, लेकिन समय सीमा समाप्त हो और एक मिनट के बाद कैश को साफ़ होगा।

मैंने कुछ शोध किया और replay ऑपरेटर पाया। ऐसा लगता है कि यह इस ज़रूरत को पूरा करेगा लेकिन मेरे कुछ प्रश्न हैं। यह गर्म क्यों है और कनेक्ट होने की जरूरत है? क्या यह cache() ऑपरेटर से अलग है? मुझे पता है कि cache() किसी विषय की नकल करता है, लेकिन इसे कनेक्ट होने की आवश्यकता नहीं है।

उत्तर

22

cache और replay विभिन्न उपयोग मामलों के लिए हैं। कैश एक ऑटो-कनेक्टिंग रीप्ले-सब कुछ कंटेनर है जो आमतौर पर लंबी अवधि की प्रतिलिपि के लिए उपयोग किया जाता है। रीप्ले में अधिक पैरामीट्रिजेशन हो सकता है और बाध्य समय/आकार प्रतिलिपि कर सकता है लेकिन डेवलपर को यह निर्धारित करने की आवश्यकता होती है कि कब शुरू करना है। autoConnect() ऑपरेटर आपको ऐसे ConnectableObservable उदाहरणों को एक सादे Observable पर चालू करने देता है जो ग्राहक द्वारा सदस्यता लेने के बाद स्रोत से जुड़ता है। इस तरह, आप कर सकते हैं एक घिरा है और ऑटो जोड़ने पुनरावृत्ति (RxJava की आवश्यकता है 1.0.14+):

source.replay(1, TimeUnit.SECONDS).autoConnect().subscribe(...); 
+0

आप शायद उल्लेख करना चाहिए 'autoconnect' प्रयोगात्मक –

+2

है अब यह मानक एपीआई बनते देर नहीं लगती है: https: //github.com/ReactiveX/RxJava/pull/3391 – akarnokd