일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- weatherKit
- CLLocationManagerDelegate
- SwiftUI Boolean 값
- 한국어 개인정보처리방침
- 러닝타이머
- UIAlertAction
- dispatchsource
- swift
- RunningTimer
- App Store Connect
- xcode로 날씨앱 만들기
- Required Reason API
- WeatherManager
- 서체관리자
- Startign Assignments
- weak var
- addannotation
- MKMapViewDelegate
- Xcode
- UICollectionViewFlowLayout
- Timer
- AnyObject
- 단일 책임원칙
- MKMapItem
- Protocol
- CoreLocation
- 러닝기록앱
- font book
- 영문 개인정보처리방침
- 클로저의 캡슐화
Archives
- Today
- Total
VesselWheel
[ReFactoring]Weather777(URLSession -> async/await) 본문
Swift의 async/await 패턴을 사용하여 비동기 처리 부분을 변경하려면 기존의 performRequestForecast 메서드와 getForecastWeather 메서드를 수정해야 합니다. 다음은 async/await를 사용하여 코드를 수정한 예시
먼저, performRequestForecast 함수를 async/await를 사용하도록 변경
private func performRequestForecast(with url: URL?) async throws -> WeatherData {
guard let url = url else {
throw NetworkError.badUrl
}
let (data, _) = try await URLSession.shared.data(from: url)
do {
let weatherData = try JSONDecoder().decode(WeatherData.self, from: data)
return weatherData
} catch {
throw NetworkError.decodingError
}
}
그 다음, getForecastWeather 메서드를 async/await 패턴으로 업데이트합니다. 이 메서드는 이제 async 함수가 되고, 외부에서 호출할 때 await를 사용해야 합니다. 또한, completion 핸들러 대신 throws를 사용하여 에러를 처리
public func getForecastWeather(latitude: Double, longitude: Double) async throws -> [(cityname: String, time: String, weatherIcon: String, weatherdescription: String, temperature: Double, wind: String, humidity: Int, tempMin: Double, tempMax: Double, feelsLike: Double, rainfall: Double)] {
LocationManager.shared.setLocation(latitude: latitude, longitude: longitude)
guard let currentLocation = LocationManager.shared.currentLocation else {
throw NetworkError.badLocation
}
guard let url = URL.urlForForecastForLocation(currentLocation, apiKey: apiKey) else {
throw NetworkError.badUrl
}
let weatherData = try await performRequestForecast(with: url)
let processor = WeatherDataProcessor()
let forecastData = processor.process(weatherData: weatherData)
return forecastData
}
이제 getForecastWeather 메서드는 비동기 함수로 작동하며, 이를 호출할 때는 await 키워드를 사용해야 하며, 호출하는 측에서 에러 핸들링을 위해 do-catch 블록을 사용하거나 에러를 전파해야 합니다.
변경된 메서드를 사용하는 예시
func someFunction() async {
do {
let forecastData = try await WeatherManager.shared.getForecastWeather(latitude: xx.xxxx, longitude: yy.yyyy)
// 여기에서 forecastData 사용
} catch {
// 에러 처리
}
}
'Xcode Study' 카테고리의 다른 글
Socket.IO 통신 (0) | 2024.05.27 |
---|---|
[트러블 슈팅] [런 잇] 디바운스(Debounce)와 Combine을 활용한 Throttle 적용하기 그리고 Caching을 통한 디버깅 (0) | 2024.04.01 |
ActivityKit & WidgetKit (0) | 2024.03.30 |
Required Reason API(from App Store Connect) (0) | 2024.03.26 |
앱 심사 요청 후 reject (0) | 2024.03.22 |