ex)
suspend fun getUser(): User?
suspend fun setUser(user: User)
// 중단 함수의 내부를 보면 선언한 타입과 리턴 타입이 다름.
fun getUser(continuation: Continuation<*>): Any?
fun setUser(user: User, continuation: Continuation<*>): Any
suspend fun myFuntion() {
println("Before")
delay(1000) // 중단 함수
println("After")
}
myFuntion 함수는 다음과 같이 추론할 수 있음.
fun myFunction(continuation: Continuation<*>): Any
ex) 설명을 위해 이름을 붙임. 기존 컨티뉴에이션 객체는 익명객체임.
val continuation =
if (continuation is MyContinuation) continuation
else MyContinuation(continuation)
label
이라는 필드를 사용해야함.
myFuntion
의 세부 구현을 간단하게 표현해보면 다음과 같음.suspend fun myFunction() {
println("Before")
delay(1000) // 중단 함수
println("After")
}
fun myFunction() {
val continuation = continuation as? MyFunctionContinuation ?: MyFunctionContinuation(continuation)
if (continuation.label == 0) { // 함수가 처음 시작
println("Before")
continuation.label = 1 // 중단되기 전 다음 상태 설정
if (delay(1000, continuation) == COROUTINE_SUSPEND) {
return COROUTINE_SUSPEND
}
}
if (continuation.label == 1) {
println("After")
return Unit
}
error("Impossible")
}
delay
에 의해 중단된 경우 COROUTINE_SUSPEND
를 반환됨.