我正在为我的app-project创建一个WeatherService类,过去几天我一直在阅读Swift 2.0中的错误处理。
根据我的阅读,我提出了这样一个课程:
enum ResultType<T, U> {
case Success(T)
case Error(U)
}
我的天气预报查找方法看起来像这样(它是异步的!):
func weatherForecastFor(location location: Location, completionHandler: (ResultType<WeatherForecast, WeatherServiceError>) -> Void) {...}
使用WeatherService
类的视图控制器如下所示:
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
他们都有一个我坚持的代表。它们都从委托方法或完成处理程序传递错误对象,如下所示:
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {...}
我的问题是:我应该如何处理解析错误?我做的ResultType是否包含此错误?用户无法对解析错误做任何事情,我无法以另一种方式处理,而不是告诉用户天气预报查找失败。我应该从这个parseError中提取一些错误细节并将其包装在我自己的一个WeatherServiceError中吗?
在方法中执行此操作并不会告诉周围的代码失败的原因:
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
self.completionHandler(ResultType.Error(WeatherServiceError.SomethingFailedSillyError))
}
答案 0 :(得分:0)
我基本上和你一样,除了我倾向于使用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)