Как создать модель представления для API с ответом массива в swift 5 - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть следующий API, ответом которого является Массив словаря https://5e99a9b1bc561b0016af3540.mockapi.io/jet2/api/v1/blogs?page= 1 & limit = 10.

Я создал для этого модель следующим образом

 import Foundation

// MARK: - BlogElement
struct BlogElement: Codable {
    let id, createdAt, content: String
    let comments, likes: Int
    let media: [Media]
    let user: [User]
}

// MARK: - Media
struct Media: Codable {
    let id, blogID, createdAt: String
    let image: String
    let title: String
    let url: String

    enum CodingKeys: String, CodingKey {
        case id
        case blogID = "blogId"
        case createdAt, image, title, url
    }
}

// MARK: - User
struct User: Codable {
    let id, blogID, createdAt, name: String
    let avatar: String
    let lastname, city, designation, about: String

    enum CodingKeys: String, CodingKey {
        case id
        case blogID = "blogId"
        case createdAt, name, avatar, lastname, city, designation, about
    }
}

typealias Blog = [BlogElement]

my класс обслуживания следующий:

import Foundation
import Alamofire

class Webservice: NSObject {

    static let shared = Webservice()

    func getData(with url: String, completion:@escaping (_ data: Blog?, _ error: Error?) -> Void) {

        AF.request(url).responseData { (responseData) in
            switch responseData.result {
            case .success(let data):

                //Apply string encoding as response is not UTF 8 formatted
                let string = String(decoding: data, as: UTF8.self)
                if let datastr = string.data(using: String.Encoding.utf8) {
                    //Map response data into model
                    do {
                        let blogData = try JSONDecoder().decode(Blog.self, from: datastr)
                        completion(blogData, nil)
                    } catch let error as NSError {
                        print(error)
                        completion(nil, error)
                    }
                }
            case .failure(let error):
                completion(nil, error)
            }
        }
    }
}

Я не уверен, как создавать и передавать значения для просмотра модели.

Спасибо

1 Ответ

0 голосов
/ 30 апреля 2020

Напишите одну функцию в вашей модели представления для получения данных из класса обслуживания.

   class sampleViewModelClass  {


    typealias successHandler = (_ response: BlogElement?) -> ()
    typealias failureHandler = (_ error: NetworkError?) -> ()


    func getList(_ url:String, completion: @escaping successHandler, failure: @escaping failureHandler)
    {
        Webservice.getData(url, success: { (response) in

                print(“ BlogModel Response \(response)”)
        })
        { (error) in

            failure(error?.errorDescription)
        }
    }

}

Теперь создайте расширение «Данные» и одну функцию в нем, которые преобразуют ваши ответы API в модель.


class Webservice: NSObject {

    static let shared = Webservice()

    func getData(with url: String, completion:@escaping (_ data: BlogElement?, _ error: NetworkError?) -> Void) {

        AF.request(url).responseData { (responseData) in
            switch responseData.result {
            case .success(let data):

                //Apply string encoding as response is not UTF 8 formatted
               data.responseJSONCodable(for: BlogElement.self, completion: { model in

                completion(model)

                          }
            case .failure(let error):
                completion(nil, error)
            }
        }
    }
}

extension Data {

     func responseJSONCodable<T: Codable>(for : T.Type, completion: @escaping (T) -> (), failure: @escaping (NetworkError) ->()) {
        let decoder: JSONDecoder = JSONDecoder()

        do {
            let decodedValue = try decoder.decode(T.self, from: self)
            completion(decodedValue)
        } catch {
            print("decoding error - \(error)")
            failure(NetworkError.decoding)
        }
    }
}


enum NetworkError : Error {

    case decoding

    var errorDescription: String {
        switch self {
        case .decoding:
            return "Something went wrong. Please try again after sometime."
        case .defaultIssue:
            return "Something went wrong"

        }
    }

}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...