У меня есть внутренний API, где я получал данные через сеанс URL. Сессия Url довольно сложна для меня, как для новичка, и данные не декодируются должным образом через сеанс URL, теперь кто-то предлагает мне использовать Alamofire. Прочитал документацию alamofire, но все еще не понимаю, как мне получить все данные и показать их в viewController. Пожалуйста, проверьте мой код сеанса URL-адреса и помогите мне преобразовать его в метод Alamofire?
Сетевой класс:
struct NetworkService{
static let shared = NetworkService()
private init(){
}
func fetchAllCategories(completion: @escaping(Result)-> Void){
request(route: .fetchAllCategories, method: .get, completion: completion)
}
private func createRequest(route: Route, method: Method, parameters : [String:Any]? = nil) -> URLRequest?
{
let urlString1 = Route.baseUrl + route.description
guard let url = URL(string: urlString1) else { return nil }
var urlRequest = URLRequest(url: url)
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpMethod = method.rawValue
if let params = parameters{
switch method{
case .get:
var urlComponent = URLComponents(string: urlString1)
urlComponent?.queryItems = params.map {
URLQueryItem(name: $0, value: "\($1)")}
urlRequest.url = urlComponent?.url
case .post, .delete, .patch:
let bodyData = try? JSONSerialization.data(withJSONObject: params, options: [])
urlRequest.httpBody = bodyData
}
}
return urlRequest
}
private func request(route: Route,method: Method, parameters: [String: Any]? = nil, completion: @escaping(Result) -> Void){
guard let request = createRequest(route: route, method: method, parameters: parameters) else {
completion(.failure(AppError.unknownError))
return
}
URLSession.shared.dataTask(with: request){ (data, response, error) in
var result: Result?
if let getData = data{
result = .success(getData)
let respondString = String(data:getData, encoding: .utf8) ?? "could not convert our data into string"
print("backend response is \(respondString)")
}
else if let error = error{
result = .failure(error)
print("error is:\(error.localizedDescription)")
}
DispatchQueue.main.async {
print("success \(result)")
self.handleRequest(result: result , completion: completion)
}
}.resume()
}
private func handleRequest(result:Result?, completion: @escaping(Result) -> Void){
guard let result = result else {
completion(.failure(AppError.unknownError))
return
}
switch result {
case .success(let data):
let decoder = JSONDecoder()
guard let response = try? decoder.decode(ApiResponse.self, from: data) else {
completion(.failure(AppError.errorDecoding))
return
}
if let error = response.error{
completion(.failure(AppError.ServerError(error)))
}
if let decodedData = response.data{
completion(.success(decodedData))
}else{
completion(.failure(AppError.unknownError))
}
case .failure(let error):
completion(.failure(error))
}
}
}
Класс ответа API:
struct ApiResponse : Decodable {
let status: Int
let message: String?
let data: T?
let error: String?
}
Класс AppError:
enum AppError: LocalizedError{
case errorDecoding
case unknownError
case inValidUrl
case ServerError(String)
var errorDescription: String?{
switch self{
case .errorDecoding:
return "response could not be decoded"
case .unknownError:
return "i have no idea what the error is"
case .inValidUrl:
return "give me a valid url"
case .ServerError(let error):
return error
}
}
}
Класс метода:
enum Method: String{
case get = "GET"
case post = "POST"
case delete = "DELETE"
case patch = "PATCH"
}
Класс маршрутизации — это тот, который возвращает все данные категорий и возвращает результат.
enum Route{
static let baseUrl = "https://yummie.glitch.me"
case fetchAllCategories
var description: String{
switch self{
case .fetchAllCategories:
return "/dish-categories"
}
}
}
Класс домашнего контроллера:
var categoresdish: [DishCategory] = []{
didSet{
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
var popular: [Dish] = []{
didSet{
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
var specials: [Dish] = []{
didSet{
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
private func loadData(){
//ProgressHUD.show()
NetworkService.shared.fetchAllCategories { [weak self] (result) in
switch result{
case .success(let allDishes):
// ProgressHUD.dismiss()
print("faheem ios success")
self?.categoresdish = allDishes.categories ?? []
self?.popular = allDishes.populars ?? []
self?.specials = allDishes.specials ?? []
case .failure(let error):
print("faheem error is \(error.localizedDescription)")
ProgressHUD.showError()
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.loadData()
}
Подробнее здесь: https://stackoverflow.com/questions/694 ... -swift-ios
Как вызвать внутренний API через Alamofire Swift iOS ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение