डेटा फ़िल्टर करने के लिए मुझे एकाधिक http अनुरोध और डेटाबेस क्वेरी करने की आवश्यकता है।

मैं Rxjava . से ज़िप ऑपरेटर का उपयोग कर रहा हूँ

मैंने अपने एकाधिक http अनुरोध तैयार करने के लिए निम्न कार्य किया

 List<Observable<List<Picture>>> requests = new ArrayList<>();


 for(String id : photoIds) {
    requests.add(pictureRepository.searchPicture(id).toObservable());
 }

मैंने अपना डेटाबेस अनुरोध तैयार करने के लिए निम्नलिखित किया:

Observable<List<Favourite>> favourites = pictureRepository.getFavourites().toObservable();

मैं देखने योग्य बनाने की कोशिश करता हूं लेकिन rxjava मेरा कोड स्वीकार नहीं कर रहा है

Observable.zip(
        requests, favourites,
        new BiFunction<Object[], List<Favourite>, List<FavouritePictures>>() {
            @Override
            public List<FavouritePictures> apply(Object[] t1, List<Favourite> t2) throws Exception {
                return /*here I want to check the favourites and return a list*/;
            }
        }
);

क्या इसको हासिल करने के लिए कोई रास्ता है? धन्यवाद

3
Shura Capricorn 15 जून 2020, 11:42

1 उत्तर

सबसे बढ़िया उत्तर

एक समाधान जो इसके लिए काम कर सकता है वह निम्नलिखित है:

val photoIds = listOf(1, 2, 3)
var index = 0

Observable.just(0).flatMapSingle {
        pictureRepository.searchPicture(photoIds[index])
        index += 1
    }.repeatUntil {
        index + 1 == photoIds.size - 1
    }.toList().zipWith(pictureRepository.getFavourites(),
         BiFunction { listOfPictures, listOfFavoratePictures ->
             // Return your list
         })
  1. यह देखने योग्य धारा 0 उत्सर्जित करके शुरू होगी;
  2. फिर यह स्ट्रीम को सिंगल ऑब्जर्वेबल में फ़्लैटमैप करेगा और सर्चपिक्चर कॉल से ऑब्जर्वेबल स्ट्रीम लौटाएगा;
  3. यह प्रक्रिया तब तक जारी रहेगी जब तक कि अंतिम आइटम इंडेक्स तक नहीं पहुंच जाता;
  4. फिर हम परिणाम को एक सूची के रूप में उत्सर्जित करने के लिए मैप करते हैं;
  5. अंत में हम सिंगल ऑब्जर्वेबल को getFavourites कॉल के साथ ज़िप करते हैं;

आप इसे पुनरावर्ती विधि का उपयोग करके भी प्राप्त कर सकते हैं लेकिन मुझे व्यक्तिगत रूप से यह अधिक पठनीय लगता है।

1
Philip Wong 15 जून 2020, 12:21