在Swift 2中处理异步闭包错误的最佳方法是什么?
发布时间:2020-12-14 02:27:48 所属栏目:百科 来源:网络整理
导读:我正在使用大量的异步网络请求(顺便提一下iOS中的任何网络请求都需要异步),而我正在寻找更好地处理来自Apple的dataTaskWithRequest的错误,这些错误不支持抛出. 我有这样的代码: func sendRequest(someData: MyCustomClass?,completion: (response: NSData?)
我正在使用大量的异步网络请求(顺便提一下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 = 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,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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |