【发布时间】: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 没有任何作用。
- 代码一直在运行...最终回到我的电话
case .success(let str):。 - 运行下一行
let _ = print(str) - 转到底部的调用行末尾
}) - 这让我回到了上面显示的
context()声明,在completion(.success(response.cid)) - 跳转到函数声明中倒数第二个
}。 - 跳转到 something() 调用,特别是
completion(.success(decoded))的行 - 继续调用 something(),最终返回 Apple 模块
FPRNSURL...nInstrument和第 307 行completionHandler(data, response, error); - 它永远存在。
让我知道这是否使它变得更加令人困惑!谢谢!
【问题讨论】:
-
哪里出了问题?