0

嗨,我有一个快速的 Web 服务工作者对象,它将完成块传递给调用者视图控制器。代码如下:

func getFlightData(for airportCode: String, minutesBehind:String, minutesAhead:String, completion: (([Flight], NSError) -> Void)?) {
    var urlComponents = URLComponents()
    urlComponents.scheme = "https"
    urlComponents.host = "xxxxxxx.com"
    urlComponents.path = "/1/airports/"+airportCode+"/flights/flightInfo"
    urlComponents.queryItems = [
        URLQueryItem(name: "city", value: airportCode),
        URLQueryItem(name: "minutesBehind", value: minutesBehind),
        URLQueryItem(name: "minutesAhead", value: minutesAhead)

    ]

    guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.setValue("xxxxxxxxx", forHTTPHeaderField: "Authorization")
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)


    let task = session.dataTask(with: request) { (responseData, response, responseError) in
        DispatchQueue.main.async {


            if let error = responseError {

                //completion block???


            }

            else if let jsonData = responseData {

                let decoder = JSONDecoder()

                do {
                    let posts = try decoder.decode([Flight].self, from: jsonData)
                    //completion?(posts, nil) ???? what to pass for Error? Successful call
                } catch {
                    self.showError()

                }
            }

            else {
                //completion block???
                self.showError()
            }
        }
    }
    task.resume()
}

调用成功时,我在完成块错误参数中传递了什么值。我不能通过 nil,因为 swift 不允许我这样做。有人可以建议一种更好的方法来进行此 API 调用吗?如何发送完成块等

4

2 回答 2

0

将完成块声明为采用 aError?而不是 a NSError,然后您将能够nil在成功的情况下传递给它。这?是使参数可选的原因,这使得它可以包含nil. (另外,使用Error代替NSError,因为它是惯用的 Swift 错误类型)。

或者,您可以让您的完成块获取一个Result枚举,您可以像这样定义它:

public enum Result<T> {
    case success(T)
    case error(Error)

    public func unwrap() throws -> T {
        switch self {
        case let .success(ret):
            return ret
        case let .error(error):
            throw error
        }
    }
}

然后,您可以使用.success.error情况,具体取决于操作是成功还是失败。

于 2018-03-28T21:35:26.997 回答
0

它不接受nil,因为您的参数NSError不是可选的。

声明你的方法签名,如

func getFlightData(for airportCode: String, minutesBehind:String, minutesAhead:String, completion: (([Flight], NSError?) -> Void)?) {

....

}

它应该工作

于 2018-03-28T21:36:25.930 回答