作者:OlivIEr Halligon,原文链接,原文日期:2016-02-06
译者:ray16897188;校对:小锅;定稿:numbbbbb
在之前的一篇文章中,我介绍了如何在Swift中使用throw
做错误处理。但是如果你处理的是异步流程,throw
就无法胜任,该怎么办?
throw
和异步有啥问题? 回顾下,我们可以像下面这样,在一个可能失败的函数中使用 throw
关键字:
// 定义错误类型和一个可抛出的函数enum computationError: ErrorType { case divisionByZero }func inverse(x: float) throws -> float { guard x != 0 else { throw computationError.divisionByZero } return 1.0/x}// 调用它do { let y = try inverse(5.0)} catch { print("Woops: \(error)")}
但如果函数是异步的,需要等待一段时间才会返回结果,比如带着 completion block 的函数,这个时候怎么办?
func fetchUser(completion: User? /* throws */ -> VoID) /* throws */ { let url = … NSURLSession.sharedSession().dataTaskWithURL(url) { (data,response,error) -> VoID in// if let error = error { throw error } // 我们不能这样做,fetchUser 不能“异步地抛出” let user = data.map { User(fromData: throw
) } completion(user) }.resume()}// 调用fetchUser() { (user: User?) in /* do something */}
这种情况下如果请求失败的话,你怎么 fetchUser
?
让 throw
函数 throw
是不合理的,因为这个函数(被调用后)会立即返回,而网络错误只会在这之后发生。所以当错误发生时再fetchUser
一个错误就太晚了,completion
函数调用已经返回。
你可能想把 throws
标成 completion(user)
?但是调用 fetchUser
的代码在 fetchUser
里,不是在调用 fetchUser
的代码里。所以接受并处理错误的代码必须是fetchUser
本身,而非 的调用点。所以这个方案也不行。 总结
以上是内存溢出为你收集整理的如何处理 Swift 中的异步错误全部内容,希望文章能够帮你解决如何处理 Swift 中的异步错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)