【问题标题】:Swift Combine with SyncSwift 与同步结合
【发布时间】:2020-09-30 01:44:37
【问题描述】:

我是新来的组合......我有一个有订阅者的函数,该函数将从发布者返回一个值,但该函数将在等待接收器完成之前返回一个空值......有没有办法等待接收器并将值分配给函数返回变量,然后将字符串返回给该函数的调用者。

 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

【问题讨论】:

  • 不,你不能。这是一个异步函数,所以如果你从来没有处理过异步编程,我强烈建议你阅读一下。简而言之,如果您希望函数的调用者获取值,您需要实现一个回调(调用者将提供)并在 .sink 中调用它,或者如果调用者期望发布者,则返回发布者(.sink之前的链)

标签: swift combine


【解决方案1】:

在其他编程语言中,例如 C#,有async/await 的概念。您通过关键字async 将程序的一部分声明为异步,并使用await 关键字以非阻塞方式等待结果。然而,这个概念并没有在 Swift 中实现(即使很艰难,它也很重 discussed)。

那么,在 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
}

【讨论】:

  • Async/await 现在在 Swift 5.5 中实现 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多