Error[8]: Undefined offset: 18, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述作者:Olivier Halligon,原文链接,原文日期:2016-02-06 译者:ray16897188;校对:小锅;定稿:numbbbbb 在之前的一篇文章中,我介绍了如何在Swift中使用throw做错误处理。但是如果你处理的是异步流程,throw 就无法胜任,该怎么办? throw 和异步有啥问题? 回顾下,我们可以像下面这样,在一个可能失败的函数中使用 throw 关键字: // 定

作者: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 中的异步错误所遇到的程序开发问题。

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

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
如何处理 Swift 中的异步错误_app_内存溢出

如何处理 Swift 中的异步错误

如何处理 Swift 中的异步错误,第1张

概述作者:Olivier Halligon,原文链接,原文日期:2016-02-06 译者:ray16897188;校对:小锅;定稿:numbbbbb 在之前的一篇文章中,我介绍了如何在Swift中使用throw做错误处理。但是如果你处理的是异步流程,throw 就无法胜任,该怎么办? throw 和异步有啥问题? 回顾下,我们可以像下面这样,在一个可能失败的函数中使用 throw 关键字: // 定

作者: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 中的异步错误所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存