Swift 完成处理程序 - 使用转义闭包?

问题描述 投票:0回答:1

我是一个学习 swift 的初学者,想知道在发出 API 请求时要使用什么。什么是现代且专业的方式?

是否使用像这样的转义闭包:

func getTrendingMovies(completion:  @escaping (Result< [Movie], Error >) -> Void) {
    guard let url = URL(string: "\(Constants.baseUrl)/trending/all/day?api_key=\.(Constants.API_KEY)") else {return}
    
    let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _,
 error in
        guard let data = data, error == nil else  {
            return
        }
        do {
            let results = try JSONDecoder().decode(TrendingMoviesResponse.self, from:
 data)
            completion(.success(results.results))
        } catch {
            completion(.failure(error))
        }
    }
    task.resume()
}

或者我应该在使用像这样的委托时发出API请求而不转义闭包吗:

func performRequest(with urlString: String){
    if let url = URL(string: urlString){
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url) { data, response, error in
            if error != nil {
                delegate?.didFailWithError(error: error!)
                return
            }
            if let safeData = data{
                // created parseJson func
                if let weather = parseJSON(safeData){
                    delegate?.didUpdateWeather(self,weather: weather)
                }
            }
        }
        task.resume()
    } else {
        print("url is nil")
    }
}
ios swift completionhandler
1个回答
2
投票

我同意马特的观点,现代且专业的方式是异步/等待

func getTrendingMovies() async throws -> [Movie] {
    let url = URL(string: "\(Constants.baseUrl)/trending/all/day?api_key=\(Constants.API_KEY)")!
    let (data, _) = try await URLSession.shared.data(from: url)
    return try JSONDecoder().decode(TrendingMoviesResponse.self, from: data).results
}
© www.soinside.com 2019 - 2024. All rights reserved.