코루틴은 기본적으로 반환값으로 job을 보내는 경우가 많다.
하지만 특정상황에서 코루틴 내부에서 일어난 작업의 값을 반환하고싶거나 특정 동작이 일어난 후 진행이 되게끔 동기적으로 처리하고 싶은 경우도 생길것이다.

기존에는 async,await을 이용하면서 Deferred값으로 결과를 감싼후 진행하였지만
withContext를 이용하면 이 작업을 줄일 수 있다.
결과가 리턴될 때 까지 기다립니다.

특징은 두가지가 있다.

  • withContext 블록의 마지막 줄의 값을 반환한다.
  • withContext의 블록이 끝나기 전까지 해당 코루틴은 일시정지된다.

추가적인 기능은 코루틴의 Context를 바꾸고 싶을때 사용할 수 있습니다.


suspend fun checkPassword(password: String): BillingPassword? {
        val passwordResponse = withContext(viewModelScope.coroutineContext) {
            val request = BillingPasswordRequest(
                password
            )
            repository.checkPassword(request)
        }
        return passwordResponse
    }

위 상황은 다음과 같습니다.
아임포트 빌링을 완성을 하는 과정에서 checkPassword를 실행시켜야합니다.
파라미터로 BillingPasswordRequest 타입으로 된 request를 받아야 하고 결과값으로 BillingPassword타입으로된 객체를 반환해야 합니다.

checkPassword의 응답을 기다려야하기때문에 withContext를 사용했습니다.
repository에서 checkPassword작업이 끝나기 전까지 해당 스레드는 일시정지상태가 되고 작업이 완료되면 결과값을 반환해줍니다.

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글