gpt4 book ai didi

swift - swift 2 中的异步错误处理

转载 作者:搜寻专家 更新时间:2023-10-30 22:15:21 25 4
gpt4 key购买 nike

所以我尝试了 swift 2 中的错误处理。但是我不确定的一件事是如何让它为异步回调函数工作。假设我正在从后端加载资源。我将我的错误类型定义如下:

enum NetworkError: ErrorType {
case NoConnection
case InvalidJSON
case NoSuccessCode(code: Int)
}

我打算在出现问题时抛出其中一个案例。这是进行网络调用的函数:

func loadRequest<T: Decodable>(request: NSURLRequest, callback:T -> Void) throws {
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { data, response, error in
// Other code that parses json and at somewhere it throws
throw NetworkError.NoConnection
}
}

但是这里编译器报错:

Cannot invoke dataTaskWithRequest with an argument list of type (NSURLRequest, (_,_,_) throws) -> Void)

从这里可以明显看出,当使用 throws 声明时,相同的闭包类型被视为不同的类型。

那么在这些情况下,do-try-catch 是如何工作的?

最佳答案

错误不能异步抛出,因为错误发生时函数已经返回,你必须在闭包中处理错误,通过回调某个函数来决定 ErrorType 参数你想用它做什么。示例:

import Foundation

enum NetworkError: ErrorType {
case NoConnection
case InvalidJSON
case NoSuccessCode(code: Int)
}


func getTask() -> NSURLSessionDataTask? {
let session = NSURLSession.sharedSession()
let urlRequest = NSURLRequest(URL: NSURL(string: "www.google.com")!)
return session.dataTaskWithRequest(urlRequest) { data, response, error in
if let error = error {
asyncError(error)
} else {
// Do your stuff while calling asyncError when an error occurs
}
}
}

func asyncError(error: ErrorType) {
switch error {
case NetworkError.NoConnection:
// Do something
break
default:
break
}
}

关于swift - swift 2 中的异步错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30812959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com