Реактивное какао заставляет синхронную функцию ждать реактивного обратного вызова
Я провел много исследований и не получил никакого ответа на этот вопрос.
это мой код:
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
производителей в один более крупный производитель.