[TIL] 09.26

Junyoung_Hong·2023년 9월 26일
0

TIL_9월

목록 보기
19/19
post-thumbnail

1. Alamofire

Alamofire는 Swift로 작성된 HTTP 네트워킹 라이브러리 중 하나로, iOS 및 macOS 애플리케이션을 개발할 때 네트워크 요청을 보내고 응답을 처리하는 작업을 단순화하는 데 도움을 주는 매우 인기 있는 라이브러리 중 하나이다. Alamofire는 Apple의 Foundation 프레임워크 기반으로 작동하며, 다음과 같은 주요 기능과 장점을 제공한다:

  1. 간편한 사용: Alamofire는 간단하고 직관적인 API를 제공하여 네트워크 요청을 보내고 응답을 처리하는 프로세스를 단순화한다. 이로써 개발자는 복잡한 네트워킹 코드를 작성하는 대신 더 빠르게 애플리케이션을 개발할 수 있다.

  2. 비동기 요청 처리: Alamofire는 비동기적으로 네트워크 요청을 처리하므로, 애플리케이션이 멈추거나 끊임없이 대기하는 것을 방지한다. 이를 통해 사용자 경험을 향상시킬 수 있다.

  3. 요청 및 응답 처리: Alamofire를 사용하면 GET, POST, PUT, DELETE 등 다양한 HTTP 메서드로 요청을 보낼 수 있으며, JSON, XML, 이미지 등 다양한 데이터 형식으로 응답을 처리할 수 있다.

  4. 인터셉터 및 인증: 인터셉터를 사용하여 요청과 응답을 중간에서 가로채고 수정할 수 있으며, 인증 관련 기능을 통해 인증된 요청을 보내고 처리할 수 있다.

  5. 업로드 및 다운로드: Alamofire는 파일 업로드 및 다운로드를 지원하며, 대용량 파일의 안정적인 전송을 처리할 수 있다.

  6. 속도 및 안정성: Alamofire는 네트워크 통신의 속도 및 안정성을 개선하기 위한 다양한 최적화를 제공하며, 재시도 및 오류 처리 기능도 갖추고 있다.

1-2. 기본 포맷

GET 요청

Alamofire.request를 사용하여 GET 요청을 만들고, responseJSON을 통해 비동기로 응답을 처리한다. 성공한 경우 .success 케이스에서 응답 데이터를 처리하고, 실패한 경우 .failure 케이스에서 오류를 처리한다.

import Alamofire

let apiUrl = "https://example.com/api/resource"

Alamofire.request(apiUrl, method: .get).responseJSON { response in
    switch response.result {
    case .success(let value):
        // 요청이 성공하면 이곳에서 응답 데이터를 처리
        print("Response JSON: \(value)")
        
    case .failure(let error):
        // 요청이 실패하면 이곳에서 오류 처리를 수행
        print("Network request failed with error: \(error)")
    }
}

POST 요청

POST 요청을 만들 때는 method: .post를 사용하고, 요청 바디에 전달할 매개변수를 parameters로 지정한다.

import Alamofire

let apiUrl = "https://example.com/api/resource"
let parameters: [String: Any] = [
    "key1": "value1",
    "key2": "value2"
]

Alamofire.request(apiUrl, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
    switch response.result {
    case .success(let value):
        // 요청이 성공하면 이곳에서 응답 데이터를 처리합니다.
        print("Response JSON: \(value)")
        
    case .failure(let error):
        // 요청이 실패하면 이곳에서 오류 처리를 수행합니다.
        print("Network request failed with error: \(error)")
    }
}

1-3. URLSession을 Alamofire로 바꾸기

URLSession을 이용해서 OpenWeather API를 가져오는 코드이다.

struct WeatherManager {
    let weatherURL = "https://api.openweathermap.org/data/2.5/weather?appid="
    
    var delegate: WeatherManagerDelegate?
    
    func fetchWeather(cityName: String) {
        let urlString = "\(weatherURL)&q=\(cityName)"
        performRequest(with: urlString)
    }
    
    func fetchWeather(latitude: CLLocationDegrees, longitude: CLLocationDegrees) {
        let urlString = "\(weatherURL)&lat=\(latitude)&lon=\(longitude)"
        performRequest(with: urlString)
    }
    
    func performRequest(with urlString: String) {
        
        // 1. Create a URL
        if let url = URL(string: urlString) {
            
            // 2. Create a URLSession
            let session = URLSession(configuration: .default)
            
            // 3. Give the session a task
            let task = session.dataTask(with: url) { data, respose, error in
                if error != nil {
                    delegate?.didFailWithError(error: error!)
                    return
                }
                
                if let safeData = data {
                    if let weather = self.parseJSON(safeData) {
                        self.delegate?.didUpdateWeather(self, weather: weather)
                    }
                }
            }
            
            // 4. Start the task
            task.resume()
        }
    }
    .
    .
    .
}

Alamofire를 이용한 버전이다.

class WeatherManager {
    let weatherURL = "https://api.openweathermap.org/data/2.5/weather"
    
    var delegate: WeatherManagerDelegate?
    
    func fetchWeather(cityName: String) {
        let parameters: [String: String] = ["q": cityName, "appid": ""]
        performRequest(parameters: parameters)
    }
    
    func fetchWeather(latitude: CLLocationDegrees, longitude: CLLocationDegrees) {
        let parameters: [String: Any] = ["lat": latitude, "lon": longitude, "appid": ""]
        performRequest(parameters: parameters)
    }
    
    func performRequest(parameters: [String: Any]) {
        AF.request(weatherURL, method: .get, parameters: parameters).responseJSON { response in
            switch response.result {
            case .success(let value):
                if let jsonData = try? JSONSerialization.data(withJSONObject: value),
                   let weather = self.parseJSON(jsonData) {
                    self.delegate?.didUpdateWeather(self, weather: weather)
                } else {
                    self.delegate?.didFailWithError(error: WeatherError.parseError)
                }
            case .failure(let error):
                self.delegate?.didFailWithError(error: error)
            }
        }
    }
    .
    .
    .
}
profile
iOS 개발자를 향해 성장 중

0개의 댓글

관련 채용 정보