#ios #swift #nsurlsession #nsurlrequest #promisekit
#iOS #swift #nsurlsession #nsurlrequest #promisekit
Вопрос:
Я пытаюсь получить данные из сетевого запроса, используя PromiseKit в следующем коде ниже, но в строке seal.fulfill(data)
я получаю сообщение об ошибке «Невозможно вызвать «выполнить» со списком аргументов типа «(Данные)». Может кто-нибудь, пожалуйста, дать мне подсказку о том, что я делаю не так?
import Foundation
import PromiseKit
class NetworkService {
let baseHost: String = "api.someAwesomeSite.com"
var version: String { return "3.345" }
let configuration = URLSessionConfiguration.default
func getData<Data>(method: String, queryItems: [URLQueryItem] = []) -> Promise<Data> {
var urlConstructor = URLComponents()
urlConstructor.scheme = "https"
urlConstructor.host = self.baseHost
urlConstructor.path = "/method/(method)"
urlConstructor.queryItems = [
URLQueryItem(name: "user_id", value: ApiManager.session.userId),
URLQueryItem(name: "access_token", value: ApiManager.session.token),
URLQueryItem(name: "v", value: version),
]
urlConstructor.queryItems?.append(contentsOf: queryItems)
let request = URLRequest(url: urlConstructor.url!)
let session = URLSession(configuration: configuration)
return Promise<Data> { seal in
let task = session.dataTask(with: request) { (data, response, apiError) in
if let error = apiError {
seal.reject(error)
}
if let data = data {
seal.fulfill(data)
}
}
task.resume()
}
}
Ответ №1:
Я думаю, вы просто немного смущены своими общими аргументами. Изменить:
func getData<Data>(method: String, queryItems: [URLQueryItem] = []) -> Promise<Data> {
Для
func getData(method: String, queryItems: [URLQueryItem] = []) -> Promise<Data> {
Проблема заключалась в том, что когда у вас есть Data
аргумент общего типа, компилятор считает Data
, что это какой-то тип, который вы определите… но внутри функции, которую вы также используете Data
для ссылки на Data
тип библиотеки Swift, и это не может быть обе вещи одновременно.