- 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()
}