gpt4 book ai didi

swift - 处理 Swift 2 中异步闭包错误的最佳方法?

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

我正在使用大量异步网络请求(顺便说一句,iOS 中的任何网络请求都需要通过异步进行)并且我正在寻找更好地处理来自不支持 的 Apple 的 dataTaskWithRequest 的错误的方法>抛出

我有这样的代码:

func sendRequest(someData: MyCustomClass?, completion: (response: NSData?) -> ()) {
let request = NSURLRequest(URL: NSURL(string: "http://google.com")!)

if someData == nil {
// throw my custom error
}

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in

// here I want to handle Apple's error
}
task.resume()
}

我需要解析我可能的自定义错误并处理来自 dataTaskWithRequest 的可能的连接错误。 Swift 2 引入了 throws,但你不能从 Apple 的闭包中抛出,因为它们没有抛出支持和异步运行。

我只看到添加到我的完成 block NSError 返回的方法,但据我所知使用 NSError 是老式的 Objective-C 方式。 ErrorType 只能与 throws (afaik) 一起使用。

在使用 Apple 网络关闭时处理错误的最佳和最现代的方法是什么?据我所知,任何异步网络功能都没有用处吗?

最佳答案

有很多方法可以解决这个问题,但我建议使用一个需要 Result Enum 的完成 block .这可能是最“快捷”的方式。

结果枚举恰好有两种状态,成功和错误,这比通常导致 4 种可能状态的两个可选返回值(数据和错误)有很大优势。

enum Result<T> {
case Success(T)
case Error(String, Int)
}

在完成 block 中使用结果枚举来完成拼图。

let InvalidURLCode = 999
let NoDataCode = 998
func getFrom(urlString: String, completion:Result<NSData> -> Void) {
// make sure the URL is valid, if not return custom error
guard let url = NSURL(string: urlString) else { return completion(.Error("Invalid URL", InvalidURLCode)) }

let request = NSURLRequest(URL: url)
NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
// if error returned, extract message and code then pass as Result enum
guard error == nil else { return completion(.Error(error!.localizedDescription, error!.code)) }

// if no data is returned, return custom error
guard let data = data else { return completion(.Error("No data returned", NoDataCode)) }

// return success
completion(.Success(data))
}.resume()
}

因为返回值是一个枚举,你应该关闭它。

getFrom("http://www.google.com") { result in
switch result {
case .Success(let data):
// handle successful data response here
let responseString = String(data:data, encoding: NSASCIIStringEncoding)
print("got data: \(responseString)");
case .Error(let msg, let code):
// handle error here
print("Error [\(code)]: \(msg)")
}
}

另一种解决方案是传递两个完成 block ,一个用于成功,一个用于错误。类似的东西:

func getFrom(urlString: String, successHandler:NSData -> Void, errorHandler:(String, Int) -> Void)

关于swift - 处理 Swift 2 中异步闭包错误的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34957802/

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