我正在为我的应用程序项目创建一个 WeatherService 类,过去几天我一直在阅读有关 Swift 2.0 中的错误处理的内容。
根据我所读到的内容,我想出了这样的类(class):
enum ResultType<T, U> {
case Success(T)
case Error(U)
}
我的天气预报查找方法如下所示(它是异步的!):
func weatherForecastFor(location location: Location, completionHandler: (ResultType<WeatherForecast, WeatherServiceError>) -> Void) {...}
使用WeatherService
类的 View Controller 如下所示:
self.weatherService.weatherForecastFor(location: location) {
(result: ResultType<WeatherForecast, WeatherServiceError>) -> Void in
switch result {
case .Success(let weatherForecast): // some code here.
case .Error(let error):
switch error {
case .InvalidLocation:
// Does something
case .LocationNotFound:
// Does something
}
}
}
从我读到的内容看来,目前有多少人建议在 Swift 中处理异步方法中的错误,但如果我做错了,请纠正我。
我想知道该怎么做;在天气服务中,我使用 NSXMLParser
和 NSURLSession
它们都有一个我遵守的委托(delegate)。它们都从委托(delegate)方法或完成处理程序传递错误对象,如下所示:
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {...}
我的问题是:例如,我应该如何处理解析错误?我制作的 ResultType 应该包含此错误吗?用户无法对解析错误执行任何操作,除了告诉用户天气预报查找失败之外,我无法以其他方式处理该错误。我应该从这个 parseError 中提取一些错误详细信息并将其包装在我自己的 WeatherServiceError 之一中吗?
在方法内执行此操作不会告诉周围的代码失败的原因:
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
self.completionHandler(ResultType.Error(WeatherServiceError.SomethingFailedSillyError))
}
最佳答案
我的做法基本上和你一样,只是我更倾向于使用 OO 风格而不是函数式风格:
let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
let dispatchGroup = dispatch_group_create()
var result: String?
enum WeatherForecast {
case Success(Forecast)
case InvalidLocation
case LocationNotFound
func handle() {
switch self {
case .Success(_): result = "Success"
case .InvalidLocation: result = "InvalidLocation"
case .LocationNotFound: result = "LocationNotFound"
}
}
}
func weatherForecastFor(location _: Location) {
dispatch_group_async(dispatchGroup, dispatchQueue) {
WeatherForecast.InvalidLocation.handle() // In reality process location then call handle()
}
}
weatherForecastFor(location: Location())
dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER)
print(result)
关于ios - 处理异步错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34144151/