swift - Swift 与同步结合
问题描述
我是新来的组合......我有一个有订阅者的函数,该函数将从发布者返回一个值,但该函数将在等待接收器完成之前返回一个空值......这样我就可以等待接收器并将值分配给函数返回变量,然后将字符串返回给该函数的调用者。
func getState() -> String{
var state = ""
let statesub = API.getCheckedState(employeeId: "342344", user: user!)
statesub
.mapError({ (error) -> APIError in // 5
NSLog(error.errorDescription!)
return error
})
.sink(receiveCompletion: { _ in},
receiveValue:{
NSLog("State : \($0.state)")
state = $0.state
})
.store(in: &tokens)
return state
解决方案
在其他编程语言中,例如 C#,有async/await
. 您通过关键字将程序的一部分声明为异步,并以非阻塞方式async
等待关键字的结果。await
然而,这个概念并没有在 Swift 中实现(即使很难,它也被大量讨论)。
那么,在 Swift 中是否有替代方案?是的,使用DispatchSemaphore。您的方法应如下所示:
func getState() -> String {
var state = ""
var sema = DispatchSemaphore(value: 0)
let statesub = API.getCheckedState(employeeId: "342344", user: user!)
statesub
.mapError({ (error) -> APIError in // 5
NSLog(error.errorDescription!)
return error
})
.sink(receiveCompletion: { _ in},
receiveValue: {
defer { sema.signal() }
NSLog("State : \($0.state)")
state = $0.state
})
.store(in: &tokens)
sema.wait()
return state
}
推荐阅读
- python - 如何在没有目标值的数据集上使用决策树进行预测?
- python - 使用 PIL 库从 YCbCr 到 RGB 的色彩空间转换?
- ios - 使用 Swift 5.1 for iOS 中的 SwiftUI 使用 RadialGradient 填充动态大小的 Rectangle
- ruby-on-rails - Rails 5 yield 给出重复的内容
- python - 将python文件导入另一个python文件
- python - 使用 Python 和 Selenium 抓取 Instagram 上喜欢帖子的帐户的名称,但仅返回 11 个名称
- r - expss 包可以处理带有加权数据的多个答案问题吗?
- php - PHP 在 Heroku 上连接到 Postgres 时遇到问题
- jenkins - 在 Bash 脚本中,如何退出整个脚本并返回成功
- matlab - 如何使用 fzero() 在 MATLAB 中求解多项式方程?