2015-05-06 114 views
4

我有一個Observable,它返回一個Cursor實例(Observable<Cursor>)。我試圖利用ContentObservable.fromCursor獲取onNext回調中的每個遊標行。Flatten Observable <Observable <Cursor>> to Observable <Cursor>

一個我已經想通了的解決方案是這樣的結構:

ContentObservable.fromCursor(cursorObservable.toBlocking().first()) 
    .subscribe(cursor -> { 
     // map to object 
     // add to outer collection 
    }, e -> {},() -> { 
     // do something with list of objects (outer collection) 
    }); 

這看起來有點像,因爲toBlocking().first()一個黑客,但它的作品。我不喜歡它,因爲大多數處理都在onNext回調中完成,我們必須創建外部集合來保存中間結果。

我想用這樣的:

cursorObservable.map(ContentObservable::fromCursor) 
    .map(fromCursor -> fromCursor.toBlocking().first()) 
    .map(/* map to object */) 
    .toList() 
    .subscribe(objects -> { 
     // do something with list of objects 
    } 

這仍然採用toBlocking().first()一旦fromCursor觀察到已經完成遊標被關閉,所以沒有辦法來映射它的對象不因工作。有沒有更好的方法將Observable<Observable<Cursor>>弄平到Observable<Cursor>

回答

9

有沒有更好的方法將Observable<Observable<Cursor>>平放到Observable<Cursor>

是的,你可以使用Observable.concat方法:

public static void main(String[] args) { 
    final Observable<String> observable = Observable.just("1", "2"); 
    final Observable<Observable<String>> nested = observable.map(value -> Observable.just(value + "1", value + "2")); 
    final Observable<String> flattened = Observable.concat(nested); 

    flattened.subscribe(System.out::println); 
} 

UPDATE

實際上有一些其他的方法來轉換Observable<Observable<Cursor>>Observable<Cursor>

只需選擇一個更適合你。

更新2

另一種解決方案是修改代碼中的位,並使用flatMap操盤map

cursorObservable.flatMap(ContentObservable::fromCursor) 
    .map(/* map to object */) 
    .toList() 
    .subscribe(objects -> { 
     // do something with list of objects (outer collection) 
    } 
相關問題