Skip to content

khoavd-dev/NetworkManagerExample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 

Repository files navigation

NetworkManagerExample

This is an example of how to apply NetworkManager in an app.

📱 Platform

  • Swift 6.0
  • iOS 18.4
  • Xcode 16.3
  • Swift concurrency: async/await
  • New Observation framework (@Observable)
  • MVVM architecture

🚀 Example Usage

Define baseURL and apiVersion in your main app

extension NetworkConfiguration {
    static var baseURL: URL? {
        URL(string: "https://api.example.com")
    }
    
    static var apiVersion: String? { "/v1" }
}

📦 Make GET request

struct UserRequest: Requestable {
    typealias Response = UserModel
    var urlPath: String = "/users"
    var httpMethod: HTTPMethod = .get
}
@Observable
final class UserViewModel {
    var users: [UserModel]?
    
    func fetchUsers() async {
        do {
            let userRequest = UserRequest()
            users = try await userRequest.request()
        } catch {
            // Handle error
        }
    }
}

📦 Make POST request

struct LoginRequest: Requestable {
    typealias Response = LoginModel
    var urlPath: String = "/login"
    var httpMethod: HTTPMethod = .post
    var requestBody: Codable? {
        LoginRequestBody(username: username, password: password)
    }
    
    let username: String
    let password: String
}

fileprivate struct LoginRequestBody: Codable {
    let username: String
    let password: String
}
@Observable
final class LoginViewModel {
    var token: String?
    @ObservationIgnored private var loginModel: LoginModel?
    
    func login(username: String, password: String) async {
        do {
            let loginRequest = LoginRequest(username: username, password: password)
            loginModel = try await loginRequest.request()
            if let token = loginModel?.token {
                self.token = token
            }
        } catch {
            // Handle error
        }
    }
}

📦 Add additional headers

struct UserRequest: Requestable {
    typealias Response = UserModel
    var urlPath: String = "/users"
    var httpMethod: HTTPMethod = .get
    var headers: [String : String]? {
        ["Content-Type": "application/json"]
    }
}

📦 Add query parameters

struct UserRequest: Requestable {
    typealias Response = UserModel
    var urlPath: String = "/users"
    var httpMethod: HTTPMethod = .get
    var queryParameters: [String : String]? {
        ["sort": "asc"]
    }
}
Output URL: https://api.example.com/users?sort=asc

About

An example for NetworkManager package

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages