Reactive cocoa 强制同步函数等待响应式回调
Reactive cocoa forcing a synchronous function to wait for reactive callback
我做了很多研究,但没有得到任何答案。
这是我的代码:
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" 从响应请求(从另一台服务器)中检索到。
感谢您的帮助。
first()
function 基本上会为您完成此操作:
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
生产者连接成一个更大的生产者。
我做了很多研究,但没有得到任何答案。
这是我的代码:
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" 从响应请求(从另一台服务器)中检索到。
感谢您的帮助。
first()
function 基本上会为您完成此操作:
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
生产者连接成一个更大的生产者。