第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將 Single 應(yīng)用于 ObservableSource 而不是過度閱讀

將 Single 應(yīng)用于 ObservableSource 而不是過度閱讀

波斯汪 2023-02-23 10:53:22
總的來說,我對(duì) RX 很陌生,尤其是 rxjava,請(qǐng)?jiān)徫业腻e(cuò)誤。此操作依賴于兩個(gè)異步操作。第一個(gè)使用過濾器函數(shù)嘗試從異步 Observable 返回的列表中獲取單個(gè)實(shí)體。第二個(gè)是與設(shè)備通信并生成狀態(tài)更新的 Observable 的異步操作。我想獲取從過濾器函數(shù)創(chuàng)建的 Single,將其應(yīng)用于pairReader(...),并訂閱其 Observable 以獲取更新。我可以讓它如圖所示工作,但前提是我包含注釋take(1),否則我會(huì)得到一個(gè)異常,因?yàn)殒溤噲D從 Single 中提取另一個(gè)值。  Observable<DeviceCredential> getCredentials() {    return deviceCredentialService()            .getCredentials()            .flatMapIterable(event -> event.getData());  }  Single<Organization> getOrgFromCreds(String orgid) {    return getCredentials()      // A device is logically constrained to only have a single cred per org      .map(DeviceCredential::getOrganization)      .filter(org -> org.getId().equals(orgid))      .take(1)  // Without this I get an exception      .singleOrError();  }  Function<Organization, Observable<Reader.EnrollmentState>> pairReader(String name) {    return org -> readerService().pair(name, org);  }getOrgFromCreds(orgid)  .flatMapObservable(pairReader(readerid))  .subscribe(state -> {     switch(state) {       case BEGUN:         LOG.d(TAG, "Pairing begun");         break;       case PAIRED:         LOG.d(TAG, "Pairing success");         callback.success();         break;       case NOTIFIED_SERVER:         LOG.d(TAG, "Pairing server notified");         break;     }},     error -> {       Crashlytics.logException(error);       callback.error(error.getLocalizedMessage());     });
查看完整描述

3 回答

?
嚕嚕噠

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊

如果我沒看錯(cuò),您需要使用之前檢索到的異步數(shù)據(jù)執(zhí)行一些操作。因此,您可以使用.zip()運(yùn)算符。這是一個(gè)例子:

Observable.zip(
                getOrgFromCreds().toObservable(),
                getCredentials(),
                (first, second) -> /*create output object here*/)
                .subscribe(
                        (n) -> /*do onNext*/,
                        (e) -> /*do onError*/
                );

請(qǐng)注意,該.zip()運(yùn)算符將等待兩個(gè)流的發(fā)射,然后它將使用您在“此處創(chuàng)建輸出對(duì)象”中提供的函數(shù)創(chuàng)建外部發(fā)射。如果您不想等待這兩個(gè)項(xiàng)目 - 您可以使用.combineLatest()


查看完整回答
反對(duì) 回復(fù) 2023-02-23
?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

如果源流發(fā)出不止一項(xiàng),singleOrError()則應(yīng)該發(fā)出錯(cuò)誤。文檔

對(duì)于您的情況,請(qǐng)使用first()firstOrError()代替。

  Single<Organization> getOrgFromCreds(String orgid) { 
     return getCredentials()
      .map(DeviceCredential::getOrganization)
      .filter(org -> org.getId().equals(orgid))
      .firstOrError();
  }


查看完整回答
反對(duì) 回復(fù) 2023-02-23
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

這里的問題原來是 API 的設(shè)計(jì)方式很奇怪(不幸的是,文檔非常糟糕)。我不明白為什么我得到重復(fù)項(xiàng),并認(rèn)為我使用flatMapIterable不正確。


該deviceCredentialService.getCredentials()調(diào)用實(shí)際創(chuàng)建的是一個(gè)可觀察對(duì)象,它發(fā)出DataEvent對(duì)象,這些對(duì)象是對(duì)結(jié)果列表的簡(jiǎn)單包裝,并帶有結(jié)果來源的標(biāo)志。


API 設(shè)計(jì)者希望允許用戶使用本地緩存的數(shù)據(jù)立即填充 UI,同時(shí)執(zhí)行對(duì) REST API 的較長(zhǎng)請(qǐng)求。該DataEvent.from屬性是一個(gè)枚舉,用于標(biāo)記來自本地設(shè)備緩存或來自遠(yuǎn)程 API 調(diào)用的來源。


我解決這個(gè)問題的方法是簡(jiǎn)單地忽略來自本地緩存的結(jié)果,只從 API 發(fā)出結(jié)果:


  Observable<DeviceCredential> getCredentials() {

    return deviceCredentialService()

      .getCredentials()

      // Only get creds from network

      .filter(e -> e.getFrom() == SyncedDataSourceObservableFactory.From.SOURCE)

      .flatMapIterable(e -> e.getData());

  }


  Single<Organization> getOrgFromCreds(String orgid) {

    return getCredentials()

      // A device is logically constrained to only have a single cred per org

      .map(DeviceCredential::getOrganization)

      .filter(org -> org.getId().equals(orgid))

      .singleOrError();

  }

然后計(jì)劃是使用記憶化緩存實(shí)體,使實(shí)施應(yīng)用程序能夠訪問緩存失效。由于提供的接口不允許抑制 API 調(diào)用,因此如果應(yīng)用程序感覺它是新鮮的,則無法僅使用緩存。


查看完整回答
反對(duì) 回復(fù) 2023-02-23
  • 3 回答
  • 0 關(guān)注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)