首页 > 解决方案 > 反应性可可强制同步函数等待反应性回调

问题描述

我做了很多研究,但没有得到任何答案。

这是我的代码:

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”。

谢谢你的帮助。

标签: reactive-cocoareactive-swift

解决方案


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的,将生产者getChannelNameconnectTo生产者连接成一个更大的生产者。


推荐阅读