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

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

это мой код:

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 ответ

Решение

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 производителей в один более крупный производитель.

Другие вопросы по тегам