iOS/Swift

Swift) Continuations 활용

Brad_Heo 2024. 5. 20. 14:26

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
    }