2017-01-30 108 views
2

我是RxJava(特別是RxJava2)的新手,我似乎是一個相對容易操作的問題。我需要從數據庫獲取一些數據,遍歷數據(它被表示爲一個列表),對每個項目執行操作,將數據包裝到另一個對象中並返回。這是我迄今爲止:RxJava在列表上執行操作並返回一個可觀察值

mDataManager 
    .getStuffList(id) 
    .flatMapIterable(listOfStuff -> listOfStuff) 
    .flatMap(item -> 
     mDataManager 
      .performCount(id, item.getTitle()) 
      .doOnNext(item::setCounter) 
      .takeLast(1) 
      .map(counter -> item)) 
    .toList() 
    .toObservable() 
    .flatMap(listOfStuff -> Observable.just(new StuffWrapper(listOfStuff)); 

我遇到的問題是,我的數據管理器調用永遠不會完成。這個想法是,每當底層數據發生變化時,UI也會改變。但是,如果沒有完成這些調用,toList()將不會發出事件。

回答

0

在RxJava 2中,toList返回Single:它恰好等於Observable與一個項目。您可以通過添加.toObservable將其轉換爲Observable,但這並不經常需要。

關於你的其他變化,你的意思是whenever the underlying data changes?您的數據管理器是否通知您數據更改?

編輯:如果您mDataManager.getStuffList(id)調用返回Observable發出多個項目(也就是,它永遠不會完成,但總是發出的最新數據更改後置),那麼你需要做這樣的事情:

mDataManager 
.getStuffList(id) 
.flatMap(listOfStuff -> 
    Observable 
    .from(listOfStuff) 
    .flatMap(item -> 
     mDataManager 
      .performCount(id, item.getTitle()) 
      .doOnNext(item::setCounter) 
      .takeLast(1) 
     .map(counter -> item) 
     .toList() 
    ) 
) 
... 
+0

是的,我使用'SqlBrite',它是一個Rx包裝器,圍繞着Android SQLite幫助器類,它提供了數據更改時間的通知。但是,如果我正確理解自己的代碼,toList()將阻止我在第一個之後接收這些通知?或者我錯過了什麼?是的,我正在使用RxJava2 – vkislicins

+0

好吧,如果您需要多次調用mDataManager.getStuffList(每次數據更改時都會調用一次),那麼您需要包裝所有內容。如果OTOH的'getStuffList'調用在數據庫中的東西發生變化時返回一組完整的項目,那麼你應該跳過'flatMapIterable'並且嵌套在flatMap中的所有東西。 –

+0

你能提供一個後者的例子嗎?我不確定你的意思 – vkislicins

相關問題