[swift] - Swift에서 Alamofire를 사용하여 네트워크 활동 표시기를 커스텀하는 방법

Swift에서 Alamofire는 많이 사용되는 네트워크 라이브러리 중 하나입니다. Alamofire를 사용하면 간단한 코드로 네트워크 요청을 보내고 응답을 받을 수 있습니다. 하지만 기본적으로 제공되는 네트워크 활동 표시기는 디자인이 제한적일 수 있습니다.

따라서, 이번 포스트에서는 Alamofire를 사용하여 어떻게 네트워크 활동 표시기를 커스텀할 수 있는지 알아보겠습니다.

1. Custom Activity Indicator View 만들기

첫 번째로, 커스텀 네트워크 활동 표시기를 만들기 위해 UIView를 서브클래싱하여 커스텀 ActivityIndicator뷰를 만듭니다.

import UIKit

class CustomActivityIndicator: UIView {
    private let activityIndicatorView: UIActivityIndicatorView
    
    init() {
        activityIndicatorView = UIActivityIndicatorView(style: .large)
        super.init(frame: .zero)
        
        addSubview(activityIndicatorView)
        activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false
        activityIndicatorView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        activityIndicatorView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func startAnimating() {
        activityIndicatorView.startAnimating()
        isHidden = false
    }
    
    func stopAnimating() {
        activityIndicatorView.stopAnimating()
        isHidden = true
    }
}

위의 코드는 CustomActivityIndicator 클래스를 정의하고, 초기화 및 애니메이션을 시작하고 중지하는 기능을 제공합니다.

2. Alamofire RequestInterceptor 구현하기

다음으로, Alamofire.RequestInterceptor 프로토콜을 구현하여 모든 네트워크 요청에 대한 인터셉터를 만듭니다. 이 인터셉터를 사용하여 네트워크 요청 전후에 커스텀 네트워크 활동 표시기를 보여주고 숨길 수 있습니다.

import Alamofire

class CustomNetworkActivityIndicator: RequestInterceptor {
    private let activityIndicator: CustomActivityIndicator
    private var requestCount = 0
    
    init(activityIndicator: CustomActivityIndicator) {
        self.activityIndicator = activityIndicator
    }
    
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
        completion(.success(urlRequest))
    }
    
    func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
        completion(.doNotRetry)
    }
    
    func didSend(_ request: Request, requestTask: URLSessionTask) {
        requestCount += 1
        activityIndicator.startAnimating()
    }
    
    func didCompleteTask(_ request: Request, with error: AFError?) {
        requestCount -= 1
        
        if requestCount == 0 {
            activityIndicator.stopAnimating()
        }
    }
}

위의 코드는 CustomNetworkActivityIndicator 클래스를 정의하고, 요청 발송 및 완료시에 requestCount를 증가 및 감소시켜서 커스텀 네트워크 활동 표시기를 제어합니다.

3. 커스텀 네트워크 활동 표시기 사용하기

최종적으로, 커스텀 네트워크 활동 표시기를 사용하여 Alamofire에서 네트워크 요청을 보낼 때 활성화/비활성화 상태를 표시할 수 있습니다.

let activityIndicator = CustomActivityIndicator()
let networkActivityIndicator = CustomNetworkActivityIndicator(activityIndicator: activityIndicator)

let session = Session(interceptor: networkActivityIndicator)

위의 코드는 CustomActivityIndicator 인스턴스를 생성하고, 이를 사용하여 CustomNetworkActivityIndicator 인스턴스를 생성합니다. 그리고 Session을 생성할 때 CustomNetworkActivityIndicator을 인터셉터로 설정하여 네트워크 요청에 커스텀 네트워크 활동 표시기를 적용합니다.

마무리

이번 포스트에서는 Swift에서 Alamofire를 사용하여 네트워크 활동 표시기를 커스텀하는 방법에 대해 알아보았습니다. 커스텀 네트워크 활동 표시기를 사용하면 사용자 지정된 디자인과 동작을 가진 네트워크 활동 표시기를 만들어서 사용할 수 있습니다. 이를 통해 앱의 사용자 경험을 개선하고, 동시에 네트워크 요청에 대한 시각적 피드백을 제공할 수 있습니다.

참고 자료: