2017-10-28 6 views
0

私は(私が思うもの)一般的なシナリオでなければなりません。Observableを配列Observable内で結合する

子ビューモデルを持つViewModelがあります。両方(親と子)には、元の状態に対して変更があったかどうかを反映するためにObservable<Bool>があります。

コードは次のようになります。これはParentViewModel持って変更を除いて、正常に動作します

class ParentViewModel { 
    var children = Variable<[ChildViewModel]>([]) 

    var hasChanges: Observable<Bool> { 
     return Observable.combineLatest(children.value.map { $0.hasChanges }) 
      .map { (boolArray) in 
       boolArray.reduce(false) { $0 || $1 } 
     } 
    } 
} 

class ChildViewModel: CustomStringConvertible { 

    let title: Variable<String> 
    private let originalValue: String 

    var hasChanges: Observable<Bool> { 
     return title.asObservable() 
      .map { $0 != self.originalValue } 
    } 

    init(string: String) { 
     title = Variable<String>(string) 
     originalValue = string 
    } 

    var description: String { 
     return "\(type(of: self)) - \(title.value)" 
    } 

} 

それはないですので、children.valueから値を結合された真Observable(私はhasChangesの結合後ChildViewModelを追加する場合、それ考慮されません)。私が欲しいもの

ParentViewModelhasChangeshasChangesが同様に真であるtrueもしあれば、それのだ子供になることです。

children.asObservable() 
    .flatMap { Observable.from($0) } 
    .flatMap { $0.hasChanges } 

これは、すべての変更があった最後の子の最新の値を返しますが、2人の子供が元の値に変更し、1つのリターンを持っている場合、それは作る:

もう一つは、次のように見える、試行が失敗しましたそれはfalseを返すが、これは私が必要とするものではない。

答えて

0

最初に、.reduce()は、上流が完了したときにのみ発光します。代わりに.scan()を使用してみてください。

別のアプローチは、.merge()すべての子どもの観測にを適用し、その上に.combineLatest()をやっている可能性があります。

関連する問題