swift 2中的异步错误处理

时间:2015-06-12 22:18:08

标签: swift

所以我在swift 2中尝试了错误处理的事情。但是我不确定的一件事是如何让它适用于异步回调函数。假设我从后端加载资源。我将错误类型定义如下:

enum NetworkError: ErrorType {
    case NoConnection
    case InvalidJSON
    case NoSuccessCode(code: Int)
}

我计划在出现​​问题时抛出其中一个案例。以下是进行网络呼叫的功能:

func loadRequest<T: Decodable>(request: NSURLRequest, callback:T -> Void) throws {
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request) { data, response, error in
        // Other code that parses json and at somewhere it throws
        throw NetworkError.NoConnection
    }
}

但是这里编译器给出了错误:

  

无法使用类型的参数列表调用dataTaskWithRequest   (NSURLRequest, (_,_,_) throws) -> Void)

从这里可以看出,当用throws声明相同的闭包类型时,它被认为是一种不同的类型。

那么这种do-try-catch的东西在这些情况下是如何工作的呢?

2 个答案:

答案 0 :(得分:3)

错误不能异步抛出,因为当错误发生时函数已经返回,你必须通过调用带有ErrorType参数的函数来处理闭包内的错误来决定你想要什么与它有关。例如:

import Foundation

enum NetworkError: ErrorType {
    case NoConnection
    case InvalidJSON
    case NoSuccessCode(code: Int)
}


func getTask() -> NSURLSessionDataTask? {
    let session = NSURLSession.sharedSession()
    let urlRequest = NSURLRequest(URL: NSURL(string: "www.google.com")!)
    return session.dataTaskWithRequest(urlRequest) { data, response, error in
        if let error = error {
            asyncError(error)
        } else {
            // Do your stuff while calling asyncError when an error occurs
        }
    }
}

func asyncError(error: ErrorType) {
    switch error {
    case NetworkError.NoConnection:
        // Do something
        break
    default:
        break
    }
}

答案 1 :(得分:0)

NSURLSession.h中的任何内容似乎都不会抛出异常。所以我想知道该类是否已经转换为使用这个新功能。