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()。

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(); }

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)用程序感覺它是新鮮的,則無法僅使用緩存。
添加回答
舉報(bào)