RXSwift первый элемент одного наблюдаемого после результата другого наблюдаемого

Я новичок в реактивном мире, и теперь у меня есть проблема:

У меня есть две функции, которые возвращают наблюдаемые:

func connect() -> Observable<Connection>

а также

func execute(_ statement: Statement) -> Observable<Result>

Что мне теперь нужно сделать, так это то, что connect должно выполняться до execute, а затем я должен вернуть результат execute...

Я думал, что сделаю это, запустив функцию execute внутри функции map наблюдаемого объекта, возвращаемого connect, например так:

public func executeFetch(_ query: Statement) -> Observable<Result> {
    return self.connect()
    .map({ (connection) -> Result in
        return execute(query) // here is my problem because execute returns an Observable<Result>.
    })
}

Но поскольку execute возвращает Observable<Result>, я получаю Observable<Observable<Result>>

Как я могу решить эту проблему?


person Artur Hellmann    schedule 28.10.2016    source источник


Ответы (1)


Вместо map попробуйте использовать flatMap. flatMap позволяет связать предыдущий результат с другим Observable, тогда как map представляет собой скорее прямое преобразование значений (например, превращение Observable<A> в Observable<B>.

Нет ничего плохого в том, чтобы выполнять кучу синхронной работы внутри map, особенно если вы используете Scheduler, чтобы убедиться, что эта работа выполняется в соответствующем потоке (например, .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))), но если вы пытаетесь вплести второй Observable в свою цепочку, тогда flatMap будет идиоматическим способом сделать это.

person drhr    schedule 28.10.2016