Continuations에는 withCheckedContinuation
, withCheckedThrowingContinuation
가 있습니다. 둘 중에 차이는 에러를 return 하는지 안하는지 차이가 있습니다.
Continuations는 비동기 코드, Closure형태를 async로 변경할때 많이 사용합니다.
단, 주의사항이 있습니다.
한번에 continue를 두 번이상 호출하면 안되고, resume을 호출하면 안됩니다. 그렇게 되면 Task가 무기한 일시 중단 상태로 되어버립니다.(앱이 멈추고 결국엔 강제종료가 됩니다.)
Closure를 async로 변경하는 예시 코드
에러 x
Closure
func requestWeclomeMessage(completion: ((String) -> Void)) { completion("hi") }
async
func requestWelcomeMessage() async -> String { let task = await withCheckedContinuation { continuation in continuation.resume(returning: "hi") } return task }
에러 o
Closure
func requestWeclomeMessage(@escaping completion: ((Result<String: Error>) -> Void)) { self.requestAPI { result in switch result { case .success(let message): completion(.success, message) case .failure(let error): completion(.failure, Error) } } }
async
func requestWelcomeMessage() async throws -> String { let task = try await withCheckedThrowingContinuation { continuation in self.requestAPI { result in switch result { case .success(let message): continuation.resume(returning: message) case .failure(let error): continuation.resume(throwing: Error) } } } return task }
'iOS > Swift' 카테고리의 다른 글
Swift) Protocol을 이용한 코드 개선 (0) | 2024.05.24 |
---|---|
Swift) UIkit 화면 이동 - FullScreen (0) | 2024.05.21 |
클로저 (Closures) - 클로저 표현 (0) | 2023.04.25 |
콜렉션 타입(Collection Types) - 셋(Sets) (0) | 2023.04.21 |
콜렉션 타입(Collection Types) - Array (0) | 2023.04.19 |