2016-02-04 27 views
18

Tôi có một mảng đối tượng Thing mà tôi muốn chuyển đổi thành đối tượng ConvertedThing, sử dụng hàm không đồng bộ trả về Observable<ConvertedThing>.Làm thế nào để tôi có thể quan sát một mảng từ một dãy các quan sát?

Tôi muốn tạo một Observable<[ConvertedThing]> phát ra một giá trị khi tất cả chuyển đổi đã hoàn tất.

Làm cách nào để thực hiện điều này? Bất kỳ giúp đỡ nhiều đánh giá cao!

Trả lời

21

Bạn có thể sử dụng .merge() để kết hợp mảng quan sát thành một quan sát duy nhất và sau đó sử dụng .toArray() để xem chúng dưới dạng danh sách trong một sự kiện.

Đối RxSwift 3+ sử dụng:

let arrayOfObservables: [Observable<E>] = ... 
let singleObservable: Observable<E> = Observable.from(arrayOfObservables).merge() 
let wholeSequence: Observable<[E]> = singleObservable.toArray() 

Đối với các phiên bản trước:

let arrayOfObservables: [Observable<E>] = ... 
let singleObservable: Observable<E> = arrayOfObservables.toObservable().merge() 
let wholeSequence: Observable<[E]> = singleObservable.toArray() 
+0

điểm khởi đầu của tôi là một mảng của quan sát, chứ không phải là một trong những đơn. Vì vậy, tôi muốn lấy từ '[Observable ]' thành 'Observable <[ConvertedThing]>'. – Paul

+0

@Paul: Xin lỗi. Đã cập nhật. – kennytm

4

Đối với độc giả trong tương lai:

Sử dụng .merge().toArray() sẽ phát ra một yếu tố duy nhất khi tất cả các chuỗi quan sát được trọn vẹn . Nếu bất kỳ của các quan sát tiếp tục phát ra, nó sẽ không phát ra hoặc hoàn thành.

Sử dụng .combineLatest() sẽ trả về một Observable phát hành bản danh sách đầy đủ mỗi khi bất kỳ thay đổi quan sát được:

let arrayOfObservables: [Observable<E>] = ... 
let wholeSequence: Observable<[E]> = Observable.combineLatest(arrayOfObservables) { $0 } 
Các vấn đề liên quan