Using DataTask 1

  1. Network Manager
//
//  NetworkManager.swift
//  DataTaskAPIDemo
//
//  Created by Joynal Abedin on 1/11/23.
//

import Foundation
import Combine

extension URLSession {
  func fetchData<T: Decodable>(for url: URL, completion: @escaping (Result<T, Error>) -> Void) {
    self.dataTask(with: url) { (data, response, error) in
      if let error = error {
        completion(.failure(error))
      }

      if let data = data {
        do {
          let object = try JSONDecoder().decode(T.self, from: data)
          completion(.success(object))
        } catch let decoderError {
          completion(.failure(decoderError))
        }
      }
    }.resume()
  }
}

2. Response Model

//
//  Response.swift
//  DataTaskAPIDemo
//
//  Created by Joynal Abedin on 1/11/23.
//

import Foundation

struct Response: Codable {
    var responseCode: Int
    var result: String
    var errormessage: String?
    var data: [BookList]
}

struct BookList: Codable {
    var id: Int
    var bookId: Int
    var bookName: String
    var availableCopyNumber: Int
}

//
struct ToDo: Decodable {
  let userId: Int
  let id: Int
  let title: String
  let isComplete: Bool
  
  enum CodingKeys: String, CodingKey {
    case isComplete = "completed"
    case userId, id, title
  }
}

3. Get Data

//
//  ContentView.swift
//  DataTaskAPIDemo
//
//  Created by Joynal Abedin on 1/11/23.
//

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
                .onTapGesture {
                    getBookList()
                }
        }
        .padding()
    }
    
    //
    func getData(){
        let url = URL(string: "https://jsonplaceholder.typicode.com/todos")!
          URLSession.shared.fetchData(for: url) { (result: Result<[ToDo], Error>) in
            switch result {
            case .success(let toDos):
              // A list of todos!
                print(toDos)
            case .failure(let error):
              // A failure, please handle
                print(error)
          }
        }
    }
    
    //
    func getBookList(){
        let url = URL(string: "https://devilarticle.com/api/LibraryService/GetAllBook")!
          URLSession.shared.fetchData(for: url) { (result: Result<Response, Error>) in
            switch result {
            case .success(let bookList):
              // A list of todos!
                print(bookList)
            case .failure(let error):
              // A failure, please handle
                print(error)
          }
        }
    }
}

#Preview {
    ContentView()
}