swift - 从 dataTask completionHandler 抛出错误

标签 swift nsurlsessiondatatask

我如何快速地在这样的完成处理程序中抛出错误:

    let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
        (data, response, error) in
        do {
            //something
            completion(result)
        } catch let jsonError {
            throw CustomError.myerror //THIS DOESN'T WORK
        }
    })
    task.resume()

因为错误是

Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type '(Data?, URLResponse?, Error?) -> Void'

最佳答案

短篇小说:你不能throw dataTask completion closure

您可以在完成处理程序中返回两个值

...completion: @escaping (ResultType?, Error?)->Void

返回

completion(result, nil)
completion(nil, CustomError.myerror)

或更方便地使用具有关联类型的枚举

enum Result {
    case success(ResultType), failure(Error)
}

...completion: @escaping (Result)->Void

返回

completion(.success(result))
completion(.failure(CustomError.myerror))

你可以处理结果

foo() { result in
    switch result {
    case .success(let resultType): // do something with the result
    case .failure(let error): // Handle the error
    }
}

更新:

在使用新的内置 Result 类型的 Swift 5 中,它更加舒适,因为 Result 可以捕获抛出表达式的结果

...completion: @escaping (Result<MyType,Error>)->Void

let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
    (data, response, error) in

    completion(Result { try something()})
})
task.resume()

更新 2:

async/await 完成处理程序消失了

do {
    let (data, response) = try await URLSession.shared.data(for: request)
} catch {
     throw CustomError.myerror
}

关于swift - 从 dataTask completionHandler 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51242762/

相关文章:

ios - 为每个 Collection View 单元格创建一个数组

ios - NSURLSession 如何仅检索标题?

ios - UIKit 中的 Swift 组合。某些用户的 URLSession dataTaskPublisher NSURLErrorDomain -1

ios - NSURLSessionTask。暂停不起作用

ios - NSURLSession crash with JSON data parameter is nil while error is managed

ios - 让球落入网(子节点)并做出嗖嗖的 Action ? (PhysicsBody/ARKit)

ios - 为 splitViewController displayModeButtonItem (UIBarButtonItem) Swift IOS 9 使用自定义图像时遇到问题

ios - 关于 iOS 10 后台运行 Timer 的问题

ios - 如何从通知中心删除 MPRemoteCommandCenter

ios - 是否 URLSession.dataTask(与 :completionHandler:) always call completionHandler only once?