在Swift 2中处理异步闭包错误的最佳方法是什么?

在Swift 2中处理异步闭包错误的最佳方法是什么?,第1张

概述我正在使用大量的异步网络请求(顺便提一下iOS中的任何网络请求都需要异步),而我正在寻找更好地处理来自Apple的dataTaskWithRequest的错误,这些错误不支持抛出. 我有这样的代码: func sendRequest(someData: MyCustomClass?, completion: (response: NSData?) -> ()) { let request 我正在使用大量的异步网络请求(顺便提一下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引入了抛出,但你不能抛出Apple的封闭,因为它们没有抛出支持并且运行异步.

我只看到添加到我的完成块NSError返回的方法,但据我所知使用NSError是旧式的Objective-C方式. ErrorType只能用于throws(afaik).

使用Apple网络闭包时,处理错误的最佳和最现代的方法是什么?根据我的理解,任何异步网络功能都没有办法投入使用吗?

有很多方法可以解决这个问题,但我建议使用一个期望 Result Enum的完成块.这可能是最“快速”的方式.

结果枚举恰好有两个状态,即成功和错误,这对于通常的两个可选返回值(数据和错误)来说是一个很大的优势,它们会导致4种可能的状态.

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

在完成块中使用结果枚举完成拼图.

let InvalIDURLCode = 999let NoDataCode = 998func 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,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)")    }}

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

func getFrom(urlString: String,successHandler:NSData -> VoID,errorHandler:(String,Int) -> VoID)
总结

以上是内存溢出为你收集整理的在Swift 2中处理异步闭包错误的最佳方法是什么?全部内容,希望文章能够帮你解决在Swift 2中处理异步闭包错误的最佳方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1089822.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存