2014-09-26 31 views
1

我需要從BehaviorSubject<Observable<T>>創建Observable<T>。創建的observable只能發射一次,然後調用onComplete()如何創建一次發出項目,然後從BehaviorSubject onComplete的Observable?

有沒有辦法做到這一點?

謝謝!

編輯

private BehaviorSubject<Observable<T>> subject = BehaviorSubject.create(); 

public Observable<T> getObservable(){ 
    //return the subject as Observable<T> which emits once and call onComplete() 
} 
+1

您能詳細呢? – 2014-09-26 01:14:52

+0

實現是否將根據BehaviorSubject的類型進行更改?好的,讓我編輯這個問題。 – mradzinski 2014-09-26 01:17:08

+0

我添加了代碼以將您置於上下文中。實際上我正在實現一個通用的抽象類,所以沒有BehaviorSubject類型和我需要創建的Observable(兩者都將是T類型) – mradzinski 2014-09-26 01:28:51

回答

1

所以,你必須發出Observable<T>個BehaviorSubject,並從此你想創建一個Observable<T>只發出第一可觀測所發射的第一項目主題。你可以這樣做:

public Observable<T> getObservableWithJustOneElement(){ 
    return subject.flatMap(new Func1<Observable<T>, Observable<T>>(){ 

     @Override 
     public Observable<T> call(Observable<T> source) { 
      return source; 
     } 
    }) 
    .take(1); 
} 

我知道它看起來有點奇怪,但它應該做你想做的。首先,flatMap展平Observable<Observable<T>>只是一個Observable<T>(它只是沒有做任何映射在轉換元素的意義上)。然後,take(1)確保只有一個項目將與onNext()發射,然後onCompleted()將被調用。

如果你原本只想要由被攝體發出第一個可觀察到發射的項目,你可以用這個來代替:

public Observable<T> getObservableWithJustOneElement(){ 
    return subject.take(1) 
    .flatMap(new Func1<Observable<T>, Observable<T>>(){ 

     @Override 
     public Observable<T> call(Observable<T> source) { 
      return source; 
     } 
    }); 
} 
+0

實際上,我的意思是「放一次項目」 (一個紅色大理石,例如大理石圖)BehaviorSubject的Observable產品應該自行完成(onComplete())並停止發射物體。 – mradzinski 2014-09-26 14:52:38

+0

所以,你有一個發射observable的主體,並且你想要將它轉換爲只發出第一個observable的第一個項目的observable。然後,採取我的第一個解決方案,並在返回觀察值之前追加'take(1)'。當我再次使用鍵盤時,我會更新我的解決方案。 – 2014-09-26 15:05:25

相關問題