3 回答

TA貢獻1784條經驗 獲得超7個贊
如果我沒看錯,您需要使用之前檢索到的異步數據執行一些操作。因此,您可以使用.zip()運算符。這是一個例子:
Observable.zip( getOrgFromCreds().toObservable(), getCredentials(), (first, second) -> /*create output object here*/) .subscribe( (n) -> /*do onNext*/, (e) -> /*do onError*/ );
請注意,該.zip()
運算符將等待兩個流的發射,然后它將使用您在“此處創建輸出對象”中提供的函數創建外部發射。如果您不想等待這兩個項目 - 您可以使用.combineLatest()。

TA貢獻1847條經驗 獲得超11個贊
這里的問題原來是 API 的設計方式很奇怪(不幸的是,文檔非常糟糕)。我不明白為什么我得到重復項,并認為我使用flatMapIterable不正確。
該deviceCredentialService.getCredentials()調用實際創建的是一個可觀察對象,它發出DataEvent對象,這些對象是對結果列表的簡單包裝,并帶有結果來源的標志。
API 設計者希望允許用戶使用本地緩存的數據立即填充 UI,同時執行對 REST API 的較長請求。該DataEvent.from屬性是一個枚舉,用于標記來自本地設備緩存或來自遠程 API 調用的來源。
我解決這個問題的方法是簡單地忽略來自本地緩存的結果,只從 API 發出結果:
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();
}
然后計劃是使用記憶化緩存實體,使實施應用程序能夠訪問緩存失效。由于提供的接口不允許抑制 API 調用,因此如果應用程序感覺它是新鮮的,則無法僅使用緩存。
添加回答
舉報