꾸준히 안타치기

Moya 사용법 본문

iOS/서버연동

Moya 사용법

글자줍기 2023. 3. 5. 01:33
반응형

iOS API통신을 위한 프레임워크 Moya

  • Alamofire는 재사용이 불편하다. 그래서 이것을 개선하기 위해 Moya가 등장
  • Moya는 Network layer를 템플릿화 하고 사용할때에는 request, response만 처리 하면되는 장점이 있다.

1.구조체를 작성합니다.

import Foundation

// 모델 구조체작성
struct User: Codable {
    let id: Int
    let name: String
}

2.Userservice extention을 작성합니다.

import Foundation
import Moya

enum UserService {
    case createUser(name: String)
    case readUsers
    case updateUser(id: Int, name: String)
    case deleteUser(id: Int)
}

extension UserService: TargetType {
    // baseURL
    var baseURL: URL {
        let urlString = "https://jsonplaceholder.typicode.com"
        guard let url = URL(string: urlString) else { fatalError() }
        return url
    }
    
    // 케이스별 요청경로
    var path: String {
        switch self {
        case .readUsers, .createUser(_):
            return "/users"
        case .updateUser(let id, _), .deleteUser(let id):
            return "/users/\(id)"
        }
    }
    
    // HTTP요청 메소드
    var method: Moya.Method {
        switch self {
        case .createUser(_):
            return .post
        case .readUsers:
            return .get
        case .updateUser(_, _):
            return .put
        case .deleteUser(_):
            return .delete
        }
    }
    
    // 샘플데이터
    var sampleData: Data {
        switch self {
        case .createUser(let name):
            return "{'name':'\(name)'}".data(using: .utf8)!
        case .readUsers:
            return Data()
        case .updateUser(let id, let name):
            return "{'id':'\(id)', 'name':'\(name)'}".data(using: .utf8)!
        case .deleteUser(let id):
            return "{'id':'\(id)'}".data(using: .utf8)!
        }
    }
    
    // HTTP 작업유형
    var task: Task {
        switch self {
        case .readUsers, .deleteUser(_):
            return .requestPlain
        case .createUser(let name), .updateUser(_, let name):
            return .requestParameters(parameters: ["name": name], encoding: JSONEncoding.default)
        }
    }
    // HTTP헤더
    var headers: [String : String]? {
        return ["Content-Typer" : "application/json"]
    }
}

3.viewcontroller에서의 사용은 userProvieder를 생성후, 파라미터 값을 담아서 요청하면 응답을 받을수 있습니다.

import UIKit
import Moya

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    
    var users = [User]()
    let userProvider = MoyaProvider<UserService>()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        readRequest()
    }

    @IBAction func didTapAdd(_ sender: Any) {
        let kilo = User(id: 11, name: "준준") // 파라미터에 값담아 요청
        userProvider.request(.createUser(name: kilo.name)) { result in
            switch result {
            case .success(let response):
                print("create: \(response)")
                let newUser = try! JSONDecoder().decode(User.self, from: response.data)
                self.users.insert(newUser, at: 0)
                self.tableView.reloadData()
            case .failure(let error):
                print("create error : \(error)")
            }
        }
    }
    
    private func readRequest() {
        userProvider.request(.readUsers) { (result) in
            switch result {
            case .success(let response):
                print("read: \(response)")
                //let json = try! JSONSerialization.jsonObject(with: response.data, options: [])
                let users = try! JSONDecoder().decode([User].self, from: response.data)
                self.users = users
                self.tableView.reloadData()
                
            case .failure(let error):
                print("read request error : \(error)")
            }
        }
    }
}

 

 

https://github.com/Moya/Moya

 

GitHub - Moya/Moya: Network abstraction layer written in Swift.

Network abstraction layer written in Swift. Contribute to Moya/Moya development by creating an account on GitHub.

github.com

 

https://memohg.tistory.com/123

 

[TIL] Moya 장점과 간단한 사용법

안녕하세요 오늘은 웹 네트워크 쪽을 공부하다가 우연히 Moya를 알게 되어서 신기해서 사용방법을 정리해 보았습니다 ㅎㅎ Moya의 장점 Alamofire는 재사용이 불편하다 Moya는 Network layer를 템플릿화

memohg.tistory.com

깃예제

https://velog.io/@ddara23/iOS-Moya%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-API%ED%86%B5%EC%8B%A0%EC%B2%98%EB%A6%AC

 

iOS-Moya를 이용한 API통신처리

앱개발을 하면 반드시 해야 하는 부분이 http통신으로 restful api 데이터를 받아와서 앱에 데이터를 표시해주거나 데이터를 보내주는 기능이다.라이브러리 없이 순수 swift만으로도 개발이 가능하

velog.io

https://techblog.woowahan.com/2704/

 

iOS Networking and Testing | 우아한형제들 기술블로그

{{item.name}} Why Networking? Networking은 요즘 앱에서 거의 필수적인 요소입니다. 설치되어 있는 앱들 중에 네트워킹을 사용하지 않는 앱은 거의 없을 겁니다. API 추가가 쉽고 변경이 용이한 네트워킹

techblog.woowahan.com

 

반응형

'iOS > 서버연동' 카테고리의 다른 글

Http Status Code  (0) 2023.03.03
Socket.IO 사용법  (0) 2022.07.22
ssh_exchange_identification: read: Connection reset by peer 에러 해결  (0) 2022.07.21
네트워크 연결 체크 NMNetworkMonitor  (0) 2022.05.24
Alamofire 사용법  (0) 2022.03.15
Comments