我正在尝试实现类似于下面介绍的场景的东西(创建 URL,请求服务器,解码 json,在自定义NetworkError枚举中包装的每个步骤上都出错):
enum NetworkError: Error {
case badUrl
case noData
case request(underlyingError: Error)
case unableToDecode(underlyingError: Error)
}
//...
func searchRepos(with query: String, success: @escaping (ReposList) -> Void, failure: @escaping (NetworkError) -> Void) {
guard let url = URL(string: searchUrl + query) else {
failure(.badUrl)
return
}
session.dataTask(with: url) { data, response, error in
guard let data = data else {
failure(.noData)
return
}
if let error = error {
failure(.request(underlyingError: error))
return
}
do {
let repos …Run Code Online (Sandbox Code Playgroud) 我AuthorizationRequester可以同时从许多地方调用它,但只有第一个调用可以运行requestAuthorizationFromUser()(并等待几十秒的用户交互) - 其余的这些调用应该await是来自 的结果requestAuthorizationFromUser(),但不能直接调用它。
看代码:
actor AuthorizationRequester {
enum SimpleResult {
case success, failure
}
typealias ResultCompletion = (SimpleResult) -> ()
private var requestInProgress = false
private var requestCompletions = [ResultCompletion]()
func request(completion: @escaping ResultCompletion) async {
requestCompletions.append(completion)
guard !requestInProgress else { return }
requestInProgress = true
let result = await requestAuthorizationFromUser()
requestCompletions.forEach { $0(result) }
requestCompletions.removeAll()
requestInProgress = false
}
private func requestAuthorizationFromUser() async -> SimpleResult {
// ...some code
} …Run Code Online (Sandbox Code Playgroud)