首页 > 解决方案 > 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

标签: swiftcombine

解决方案


在其他编程语言中,例如 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
}

推荐阅读