[swift] Swift Moya에서 로딩 스피너 구현하기

Moya는 Swift에서 네트워크 요청을 쉽게 처리하도록 도와주는 라이브러리입니다. 네트워크 요청을 할 때는 종종 사용자에게 로딩 스피너를 표시하는 기능이 필요합니다. 이번 글에서는 Swift Moya를 사용하여 로딩 스피너를 구현하는 방법에 대해 알아보겠습니다.

1. Cocoapods를 사용하여 Moya 설치하기

Moya를 사용하려면 Cocoapods를 이용하여 프로젝트에 Moya를 설치해야 합니다. Podfile을 열고 다음과 같이 Moya를 추가합니다.

pod 'Moya'

설치를 완료하려면 터미널에서 pod install 명령을 실행합니다.

2. 로딩 스피너 뷰 생성하기

로딩 스피너를 표시하기 위해 UIView 서브클래스로 SpinnerView를 만들겠습니다. 다음과 같이 코드를 작성합니다.

import UIKit

class SpinnerView: UIView {
    
    private let spinner: UIActivityIndicatorView
    
    override init(frame: CGRect) {
        spinner = UIActivityIndicatorView(style: .large)
        super.init(frame: frame)
        self.addSubview(spinner)
        spinner.translatesAutoresizingMaskIntoConstraints = false
        spinner.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        spinner.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func startAnimating() {
        spinner.startAnimating()
    }
    
    func stopAnimating() {
        spinner.stopAnimating()
    }
    
}

SpinnerView 클래스는 UIActivityIndicatorView를 사용하여 로딩 스피너를 생성하고 뷰에 추가합니다. startAnimating()과 stopAnimating() 메소드를 사용하여 로딩 애니메이션을 제어할 수 있습니다.

3. MoyaProvider에 로딩 스피너 적용하기

이제 MoyaProvider에 로딩 스피너를 적용해보겠습니다. 네트워크 요청이 시작할 때 SpinnerView를 생성하고 네트워크 요청이 완료될 때 SpinnerView를 제거하는 기능을 추가합니다.

import Moya

class MyAPI {
    
    private let provider: MoyaProvider<MyService>
    private let spinnerView: SpinnerView
    
    init() {
        provider = MoyaProvider<MyService>()
        spinnerView = SpinnerView(frame: UIScreen.main.bounds)
    }
    
    func request() {
        spinnerView.startAnimating()
        provider.request(.myEndpoint) { [weak self] result in
            self?.spinnerView.stopAnimating()
            
            switch result {
            case .success(let response):
                // 네트워크 요청 성공
                break
            case .failure(let error):
                // 네트워크 요청 실패
                break
            }
        }
    }
    
}

MyAPI 클래스에서는 MoyaProvider와 SpinnerView 객체를 선언하고, request() 메소드에서 네트워크 요청을 보냅니다. 네트워크 요청 전에 startAnimating()을 호출하여 로딩 스피너를 표시하고, 응답이 도착하면 stopAnimating()을 호출하여 로딩 스피너를 제거합니다.

결론

이제 Swift Moya를 사용하여 로딩 스피너를 구현하는 방법에 대해 알아보았습니다. MoyaProvider에 SpinnerView를 적용하여 네트워크 요청 중에 인디케이터를 표시하고, 응답이 도착하면 인디케이터를 제거할 수 있습니다. 이를 통해 사용자에게 원활한 경험을 제공할 수 있습니다.