Реактивное какао заставляет синхронную функцию ждать реактивного обратного вызова - PullRequest
0 голосов
/ 26 сентября 2018

Я провел много исследований и не получил никакого ответа на этот вопрос.

это мой код:

fileprivate var dispose: ScopedDisposable<AnyDisposable>?    

func connectToServer() {
    ...
    let user = ...
    let channelName = getChannelName(user)
    self.connector.connectTo(channelName)
}

func getChannelName(_ user: String) -> String {
    var channelName: String = ""
    self.dispose = ScopedDisposable(
        self.service.requestChannelNameFromServerForUser(user)
        .startWithValues({ results in
            channelName = results[0].channelName
        })
    )
    return channelName // this will return "" because callback hasn't returned yet
}

Я пытаюсь найти способ сделатьфункция "getChannelName" для ожидания получения "channelName" из реактивного запроса (с другого сервера).

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 26 сентября 2018

Функция first() по сути сделает это за вас:

func getChannelName(_ user: String) -> String {
    let result = self.service.requestChannelNameFromServerForUser(user).first()
    if let results = result?.value {
        return results[0].channelName
    }
    else {
        // The producer returned no values or an error. Return a default value or throw error or something.
        return ""
    }
}

Но более идиотский способ сделать это - сделать connectToServer сам асинхронным SignalProducerкоторый соединяет производителей getChannelName и connectTo в одного крупного производителя.

...