微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift 2中的异步错误处理

所以我在 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
    }
}

但这里编译器给出错误

Cannot invoke dataTaskWithRequest with an argument list of type
(NSURLRequest,(_,_,_) throws) -> Void)

从这里可以看出,当使用throws声明时,相同的闭包类型被视为不同的类型.

那么这种尝试捕获的东西在这些情况下是如何工作的呢?

不能异步抛出错误,因为该函数错误发生时已经返回,您必须通过使用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,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
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐