코루틴은 기본적으로 반환값으로 job을 보내는 경우가 많다.
하지만 특정상황에서 코루틴 내부에서 일어난 작업의 값을 반환하고싶거나 특정 동작이 일어난 후 진행이 되게끔 동기적으로 처리하고 싶은 경우도 생길것이다.
기존에는 async,await을 이용하면서 Deferred값으로 결과를 감싼후 진행하였지만
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작업이 끝나기 전까지 해당 스레드는 일시정지상태가 되고 작업이 완료되면 결과값을 반환해줍니다.