处理异步错误处理

时间:2015-12-07 22:03:29

标签: ios swift error-handling

我正在为我的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的异步方法中处理错误,但如果我做错了,请纠正我。

我想知道该怎么做;在天气服务中我使用NSXMLParserNSURLSession他们都有一个我坚持的代表。它们都从委托方法或完成处理程序传递错误对象,如下所示:

func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {...}

我的问题是:我应该如何处理解析错误?我做的ResultType是否包含此错误?用户无法对解析错误做任何事情,我无法以另一种方式处理,而不是告诉用户天气预报查找失败。我应该从这个parseError中提取一些错误细节并将其包装在我自己的一个WeatherServiceError中吗?

在方法中执行此操作并不会告诉周围的代码失败的原因:

func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
        self.completionHandler(ResultType.Error(WeatherServiceError.SomethingFailedSillyError))
    }

1 个答案:

答案 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)