ios - 处理异步错误处理

标签 ios swift error-handling

我正在为我的应用程序项目创建一个 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 中处理异步方法中的错误,但如果我做错了,请纠正我。

我想知道该怎么做;在天气服务中,我使用 NSXMLParserNSURLSession 它们都有一个我遵守的委托(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/

相关文章:

c - sqrt 函数出现小错误

r - 如何报告 R 中的错​​误索引?

ios - NSUserDefaults 在同步时崩溃

ios - 仅在用户单击时处理本地通知

arrays - 基于多个属性在 Swift 中过滤数组

ios - 增加 SKShader 中的统一值

android - 如何计算Android 2日期之间的差异?

ios - 如何在 SpriteKit 和 SceneKit 中暂停游戏 - SWIFT

ios - 触发点击 MSSticker 或以编程方式查看?

ios - 都是同步的,但是为什么 "ignoring”函数的NotificationQueue可以重复通知呢?