Vas*_*ily 6 asynchronous throw nserror swift
我使用了很多异步网络请求的(顺便说一句任何网络请求的iOS需要通过异步),我发现的方式来更好地应对来自苹果的错误,dataTaskWithRequest它并不支持throws.
我有这样的代码:
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()
}
Run Code Online (Sandbox Code Playgroud)
我需要解析我可能的自定义错误并处理可能的连接错误dataTaskWithRequest.引入了Swift 2 throws,但你不能抛弃Apple的关闭,因为它们没有抛出支持并且运行异步.
我只看到添加到我的完成块NSError返回的方法,但据我所知使用的NSError是旧式的Objective-C方式.ErrorType只能用于投掷(afaik).
使用Apple网络闭包时,处理错误的最佳和最现代的方法是什么?根据我的理解,任何异步网络功能都没有办法投入使用吗?
Cas*_*sey 13
有很多方法可以解决这个问题,但我建议使用一个期望结果枚举的完成块.这可能是最"迅捷"的方式.
结果枚举恰好有两个状态,即成功和错误,这对于通常的两个可选返回值(数据和错误)来说是一个很大的优势,它们会导致4种可能的状态.
enum Result<T> {
case Success(T)
case Error(String, Int)
}
Run Code Online (Sandbox Code Playgroud)
在完成块中使用结果枚举完成拼图.
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()
}
Run Code Online (Sandbox Code Playgroud)
因为返回值是一个枚举,你应该关闭它.
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)")
}
}
Run Code Online (Sandbox Code Playgroud)
另一个解决方案是传递两个完成块,一个用于成功,一个用于错误.类似的东西:
func getFrom(urlString: String, successHandler:NSData -> Void, errorHandler:(String, Int) -> Void)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3063 次 |
| 最近记录: |