【问题标题】:How do I correctly handle & complete this function that takes in an @escaping function correctly?我如何正确处理和完成这个正确接受 @escaping 函数的函数?
【发布时间】:2022-07-21 22:01:31
【问题描述】:

我知道有很多关于如何使用@escaping 函数的问题已经得到解答。我的问题有点小众,因为我正在使用一个 API,它为我提供了一个接受 @escaping 函数的函数(或者我认为如此)。我需要帮助解码 (1) 我正在使用的函数声明及其含义,以及 (2) 我如何编写函数以有效地调用它,并完成它并能够退出。

API 函数是这样声明的(隐藏了一些东西),包裹在一个更大的结构中,我将调用 specialStruct

public func context(completion: @escaping ((Result<String, SpecialClassError>) -> Void)) {
    class.something() { result in
        switch result {
            case .success(let response):
                completion(.success(response.cid))
            case.failure(let error):
                completion(.failure(.network(error: error), data: nil)))
        }
    }
}

目前,我正在运行这个:

specialStruct.context(completion: {result in 
    switch result {
        case .success(let str):
            let _ = print(str)
        case .failure(let error):
            let _ = print(error.localizedDescription)
    }
})

当我单步执行我的处理程序时会发生这种情况,这让我有点困惑: 它被包装在 SwiftUI 视图中的 init() 中。它在一开始就经过一次,但实际上并没有进入上下文?它似乎开始了,但对result 没有任何作用。

  1. 代码一直在运行...最终回到我的电话 case .success(let str):
  2. 运行下一行let _ = print(str)
  3. 转到底部的调用行末尾})
  4. 这让我回到了上面显示的context() 声明,在completion(.success(response.cid))
  5. 跳转到函数声明中倒数第二个}
  6. 跳转到 something() 调用,特别是 completion(.success(decoded)) 的行
  7. 继续调用 something(),最终返回 Apple 模块 FPRNSURL...nInstrument 和第 307 行 completionHandler(data, response, error);
  8. 它永远存在。

让我知道这是否使它变得更加令人困惑!谢谢!

【问题讨论】:

  • 哪里出了问题?

标签: swift swiftui


【解决方案1】:

您编写的步骤准确地描述了Asynchronous API 调用,这是预期的行为,因为 api 需要时间来为您提供请求的结果,而Swift 不会等到它完成..

另外,在函数context中,你不需要所有的代码,你可以简单地做:

public func context(completion: @escaping ((Result<String, SpecialClassError>) -> Void)) {
    class.something() { result in
        completion(result)
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多