首页 > 解决方案 > 以下两种方法的 Apple 组合等效项是什么?

问题描述

在 URLSession.shared.dataTaskPublisher(for:>) 中有一个 URL Session 的等价物,同样用于处理“错误沙解码”但是如何处理 discardableResult 的返回类型?在 URLSession.shared.dataTaskPublisher(for:>) 中有一个 URL Session 的等价物,同样用于处理错误沙解码

@discardableResult class func taskForGETRequest<ResponseType: Decodable>(url: URL, responseType: ResponseType.Type, completion: @escaping (ResponseType?, Error?) -> Void) -> URLSessionTask {
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data else {
            DispatchQueue.main.async {
                completion(nil, error)
            }
            return
        }
        let decoder = JSONDecoder()
       
        do {
            let responseObject = try decoder.decode(ResponseType.self, from: data)
            DispatchQueue.main.async {
                completion(responseObject, nil)
            }
        } catch {
            do {
                let errorResponse = try decoder.decode(TMDBResponse.self, from: data)
                completion(nil,errorResponse)
                
            } catch {
                DispatchQueue.main.async {
                    completion(nil, error)
                }
            }
            
        }
    }
    task.resume()
    return task
}

class func taskForPOSTRequest<RequestType: Encodable, ResponseType: Decodable>(url: URL, responseType: ResponseType.Type, body: RequestType, completion: @escaping (ResponseType?, Error?) -> Void) {
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try! JSONEncoder().encode(body)
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        guard let data = data else {
            completion(nil, error)
            return
        }
        let decoder = JSONDecoder()
        do {
            let responseObject = try decoder.decode(ResponseType.self, from: data)
            completion(responseObject, nil)
        } catch {
            do {
                let errorResponse = try decoder.decode(TMDBResponse.self, from: data)
                completion(nil,errorResponse)
                
        } catch {
            DispatchQueue.main.async {
                completion(nil, error)
            }
        }
    }
}
task.resume()

}

标签: iosswiftcombine

解决方案


推荐阅读