스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프

54. 스파르타 코딩 클럽 - 봄여어름갈겨어울 #4 (날씨앱)

seongpil Heo 2025. 5. 23. 21:09

  🌤️  봄여어름갈겨어울 (심화 팀 프로젝트)

 

53. 스파르타 코딩 클럽 - 봄여어름갈겨어울 #3 (날씨앱)

52. 스파르타 코딩 클럽 - 봄여어름갈겨어울 #2 (날씨앱)51. 스파르타 코딩 클럽 - 봄여어름갈겨어울 #1 (날씨앱)🌤️ 봄여어름갈겨어울 (심화 팀 프로젝트)최종 프로젝트 전 마지막 팀 프로젝트인

coding-pill.tistory.com


 👨🏻‍💻  오늘 작업 내용

[ 1. NetworkManager에 날씨 아이콘을 불러오는 함수 추가 ]

 

[Feat] #17 - NetworkManager에 날씨 아이콘을 불러오는 함수 추가 by heopill · Pull Request #18 · mnh4140/First-pa

close #17 ⛳️ Work Description NetworkManager에 날씨 아이콘을 불러오는 함수 추가하였습니다 Single을 사용해서 AF.request 성공시 image를 UIImage 형태로 Return 📢 To Reviewers 코드리뷰 부탁드립니다. ✅ Checklist

github.com

// 날씨 아이콘을 불러오는 함수
func loadIconImage(icon: String) -> Single<UIImage> {
    return Single.create { single in
        let imageUrl = "https://openweathermap.org/img/wn/\(icon)@2x.png"

        AF.request(imageUrl).responseData { response in
            if let data = response.data, let image = UIImage(data: data) {
                single(.success(image))
            }
        }

        return Disposables.create()
    }
}

 

[ 2. 팀원과 ViewModel 바인딩 작업 ]

 

[Feat] NetworkManager를 이용해 현재 날씨 구현 by ghnn-n · Pull Request #16 · mnh4140/First-party_Spr-summmer-fal-win

close #14 ⛳️ Work Description 현재 날씨를 표시하는 셀 구현 📸 Screenshot 📢 To Reviewers 코드리뷰 부탁드립니다. ✅ Checklist 주석 및 프린트문 제거 확인. 컨벤션 준수 확인.

github.com

 

[ 3. NetworkManager 함수 수정 - weatherForecast와 image data 10개를 방출하는 함수 추가 ]

// weatherForecast 와 icon image Data 배열 10개를 방출하는 함수
    func fetchForeCastAndTenImageData(lat: Double, lon: Double) -> Single<(WeatherForecast, [Data])> {
        return fetchForeCastData(lat: lat, lon: lon)
            .flatMap { weatherForecast in
                
                // 예보에서 아이콘 코드 최대 10개 추출
                let iconIds = weatherForecast.list.prefix(10).compactMap { $0.weather.first?.icon }
                
                // 각 아이콘 코드로부터 이미지 데이터 다운로드 요청 Single 배열
                let imageSingles = iconIds.map { iconIds in
                    return self.fetchIconImageData(iconIds: iconIds)
                }
                
                // 모든 이미지 데이터 다운로드 완료 후 결과 결합
                return Single.zip(imageSingles) { imageDatas in
                    return (weatherForecast, imageDatas)
                }
            }
    }
    
    // 날씨 아이콘을 불러오는 함수 - Data를 반환
    func fetchIconImageData(iconIds: String) -> Single<Data> {
        return Single.create { single in
            let imageUrl = "https://openweathermap.org/img/wn/\(iconIds)@2x.png"
            
            // alamofire을 이용해서 request 후 성공시 받은 response에서 data를 방출
            AF.request(imageUrl).responseData { response in
                switch response.result {
                case .success(let data):
                    single(.success(data)) // 성공시
                case .failure(let error):
                    single(.failure(error)) // 실패시
                }
            }
            
            return Disposables.create()
        }
    }